我正在尝试使用正则表达式从字符串中提取一些文本。给定一个字符串,我希望提取“标签”。标签可以通过两种方式定义: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
提交
取消