为了账号安全,请及时绑定邮箱和手机立即绑定

执行正则表达式查找全部的更好方法

执行正则表达式查找全部的更好方法

偶然的你 2022-11-29 15:20:42
我正在尝试使用正则表达式从字符串中提取一些文本。给定一个字符串,我希望提取“标签”。标签可以通过两种方式定义: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+))

请参阅regex101.com 上的演示


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)


查看完整回答
反对 回复 2022-11-29
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

关于 a)/b):

我会为 python 3.7-3.8 建议以下正则表达式:

@(?:"((?:\w+\s{1}){0,}\w+)"){0,1}(?:(\w+){0,1})


查看完整回答
反对 回复 2022-11-29
  • 2 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信