我正在嘗試使用正則表達式從字符串中提取一些文本。給定一個字符串,我希望提取“標簽”。標簽可以通過兩種方式定義:1) 一個@符號 eg后面的單個單詞@tag應該返回tag2)@"和"eg之間的多個單詞@"multiple words tag"應該返回multiple words tag。對于 (1),我有模式\B@\w+,對于 (2),我有模式@"(.*?)"。我有幾個問題: a) 模式 1 返回帶有still 前綴的標簽。@如何更改模式以僅返回不帶的單詞@?b) 如何將這些模式組合成一個可用于以下用途的模式:re.findall(pattern, string)先感謝您。
2 回答

慕沐林林
TA貢獻2016條經驗 獲得超9個贊
條件正則表達式的一個很好的用例:
@(")?((?(1)[^"]+|\w+))
看
import re
text = """
lorem ipsum @"multiple words tag"
lorem ipsum @tag
"""
tags = [m.group(2) for m in re.finditer(r'@(")?((?(1)[^"]+|\w+))', text)]
print(tags)
# ['multiple words tag', 'tag']
為了替換匹配項并獲取標簽,請使用以下代碼:
import re
text = """
lorem ipsum @"multiple words tag"
lorem ipsum @tag
"""
tags = []
def replacer(match):
tags.append(match.group(2))
return ""
text = re.sub(r'@(")?((?(1)[^"]+|\w+))(?(1)")', replacer, text)
print(text)
print(tags)

拉莫斯之舞
TA貢獻1820條經驗 獲得超10個贊
關于 a)/b):
我會為 python 3.7-3.8 建議以下正則表達式:
@(?:"((?:\w+\s{1}){0,}\w+)"){0,1}(?:(\w+){0,1})
添加回答
舉報
0/150
提交
取消