我有一個格式的字串:
my_string = 'hello|foo world|foo how|bar are|bar you|bar today|foo'
我想回傳一個串列,其中 foo 后面的所有連續單詞都組合在同一個字串中,但中間帶有“| bar”單詞的單詞在單獨的字串中。如果我嘗試重復前瞻:
re.findall(r'(\w (?=\|foo\b)) ',my_string)
回傳
['hello', 'world', 'today']
但我想回傳的是
['hello world', 'today']
因為 'hello' 和 'world' 沒有用非 foo 詞分隔。
在我真正的問題中,“foo”后面的單詞序列將出現在正在搜索的字串中的次數是未知的,“bar”可能是幾種不同的模式。
我可以通過幾個替換來解決它,首先用拆分指示器替換所有非 foo 模式并在其上拆分,然后洗掉 foos 并剝離空格:
bars_removed = re.sub('(\w \|(?!foo)[a-z] ) ','split_string',my_string)
only_foo_words = [re.sub('\|foo','',x).strip() for x in bars_removed.split('split_string')]
它回傳所需的結果,但我覺得有一種方法可以使用我缺少的 findall 或 finditer 來做到這一點。
uj5u.com熱心網友回復:
您不能在捕獲到同一組的其他文本之間“排除”文本。
您需要將前瞻替換為消費模式,提取所有連續匹配,然后作為后處理步驟|foo僅使用方法將其洗掉。str.replace
final_list = [x.replace('|foo','') for x in re.findall(r'\w \|foo(?:\s \w \|foo)*', my_string)]
請參閱正則運算式演示。
詳情:
\w- 一個或多個單詞字符\|foo- 一個|foo字串(?:\s \w \|foo)*- 匹配零個或多個序列的非捕獲組\s- 一個或多個空格\w \|foo- 一個或多個單詞字符,然后是一個|foo字串。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479787.html
標籤:python-3.x 正则表达式 蟒蛇重新
下一篇:計算矩陣中的帽子戲法勝利
