python - 正则表达式多个相同模式/重复捕获无法正常工作,仅匹配第一个和最后一个

标签 python regex python-3.x

我的正则表达式:

联系人[::]\s{1,2}([^\s,,、]+)(?:[\s,,、]{1,2}([^\s,,、]+))*

测试字符串:

联系人: 啊啊,实打实大, 好说歹说、实打实  实打实大

代码

>>> import regex as re
>>> p = r'联系人[::]\s*([^\s,,、]+)(?:[\s,,、]{1,2}([^\s,,、]+))*'
>>> s = '联系人: 啊啊,实打实大, 好说歹说、实打实  实打实大'
>>> re.findall(p, s)
[('啊啊', '实打实大')]

#  finditer
>>> for i in re.finditer(p, s):
...     print(i.groups())
...
('啊啊', '实打实大')

匹配:

enter image description here

enter image description here

您可以在这里测试 https://regex101.com/ (regex101现在无法保存正则表达式,所以我必须发布上面的图片)

<小时/>

我希望所有组都按 [\s,,、] 分割,但只匹配第一个和最后一个。我不觉得我的正则表达式有任何错误,尽管结果是错误的,这让我卡了半个小时......

最佳答案

正如我在评论中提到的,您需要使用 re.search (仅获取单个匹配项)或 re.finditer (获取多个匹配项)并且访问相应的组captures(在您的情况下,它是captures(2)):

>>> import regex as re
>>> p = r'联系人[::]\s*([^\s,,、]+)(?:[\s,,、]{1,2}([^\s,,、]+))*'
>>> s = '联系人: 啊啊,实打实大, 好说歹说、实打实  实打实大'
>>> res = []
>>> for x in re.finditer(p, s):
    res.append(x.captures(2))

>>> print(res)
[['实打实大', '好说歹说', '实打实', '实打实大']]

>>> m = re.search(p, s)
>>> if m:
    print(m.captures(2))
['实打实大', '好说歹说', '实打实', '实打实大']    

关于python - 正则表达式多个相同模式/重复捕获无法正常工作,仅匹配第一个和最后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386855/

相关文章:

python - 在ROS2中导入包中的模块

c++ - Boost python参数错误

javascript - 用于检查数字字段不具有/或具有所有相同数字的正则表达式

javascript - 使用 JavaScript 替换字符串中的 # 和\s

python - 创建单独转义的单引号和双引号,其中也存在换行符/python

python-3.x - Snakemake - 如何使用文件的每一行作为输入?

python - 将 Windows Linux 子系统 bash 与 VS Code 结合使用时出现 "No such file or directory"

Python:如何找到使levenshtein距离的字符的位置

python - 尝试使用Python选择具有红色和绿色背景的Excel单元格

PHP-预匹配?