gpt4 book ai didi

python - 如何定义一个正则表达式来匹配锚定在搜索文本中同一位置的多个模式?

转载 作者:行者123 更新时间:2023-11-30 22:08:15 25 4
gpt4 key购买 nike

我正在尝试使用Python的findall尝试查找字符串中所有带连字符的非连字符标识符(这是为了插入现有代码,因此使用findall之外的任何结构都不起作用)。如果您想象这样的代码:

regex = ...
body = "foo-bar foo-bar-stuff stuff foo-word-stuff"

ids = re.compile(regex).findall(body)

我希望 ids 值为 ['foo', 'bar', 'word', 'foo-bar', 'foo-bar-stuff', 和 ' stuff'](虽然不是 bar-stuff,因为它是连字符,但不会显示为独立的空格分隔标识符)。数组/集合的顺序并不重要。

匹配非连字符标识符的简单正则表达式是 \w+,而匹配连字符标识符的简单正则表达式是 [\w-]+。但是,我无法找出一个同时执行这两项操作的方法(我无法完全控制代码,因此无法将列表连接在一起 - 如果可能的话,我想在一个正则表达式中执行此操作)。

我尝试过 \w|[\w-]+ 但由于表达式是贪婪的,因此会错过 bar 例如,仅匹配 -bar 因为 foo 已经匹配,并且它不会从相同的起始位置重试该模式。我想找到(例如) foofoo-bar 的匹配项,它们在相同的字符串位置开始(锚定)(我认为 findall 根本不考虑)。

我一直在尝试一些技巧,例如前面提到的前瞻/后瞻,但我找不到任何方法使它们适用于我的场景。

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用

import re
s = "foo-bar foo-bar-stuff stuff" #=> {'foo-bar', 'foo', 'bar', 'foo-bar-stuff', 'stuff'}
# s = "A-B-C D" # => {'C', 'D', 'A', 'A-B-C', 'B'}
l = re.findall(r'(?<!\S)\w+(?:-\w+)*(?!\S)', s)
res = []
for e in l:
res.append(e)
res.extend(e.split('-'))
print(set(res))

图案详细信息

  • (?<!\S) - 前面没有非空白
  • \w+ - 1+ 个单词字符
  • (?:-\w+)* - 零次或多次重复
    • - - 连字符
    • \w+ - 1+ 个单词字符
  • (?!\S) - 之后没有非空白。

请参阅pattern demo online .

请注意,为了获取所有项目,我将匹配项与 - 分开。并将这些项目添加到结果列表中。然后,用set ,我删除了所有最终的欺骗。

关于python - 如何定义一个正则表达式来匹配锚定在搜索文本中同一位置的多个模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com