Python 使用正则表达式查找无序单词
我想使用正则表达式来查找字符串中的第一个序列,其中一组单词以任意顺序出现 例如,如果查找单词Python 使用正则表达式查找无序单词,python,regex,Python,Regex,我想使用正则表达式来查找字符串中的第一个序列,其中一组单词以任意顺序出现 例如,如果查找单词hello、my和world,则: 对于hello my sweet world,表达式将匹配hello my sweet world 对于oh my,hello world,它将匹配my,hello world 对于噢,我的世界,你好世界它将匹配我的世界,你好 对于hello world,没有匹配项 经过一些研究,我尝试了表达式(?=.*\bhello\b)(?=.*\bmy\b)(?=.*\bwo
hello
、my
和world
,则:
- 对于
,表达式将匹配hello my sweet world
李>hello my sweet world
- 对于
,它将匹配oh my,hello world
李>my,hello world
- 对于
它将匹配噢,我的世界,你好世界
李>我的世界,你好
- 对于
,没有匹配项hello world
(?=.*\bhello\b)(?=.*\bmy\b)(?=.*\bworld\b)。*
,但这并不能解决我的问题,因为如果所有单词都存在,它会匹配整个字符串,如:
- 对于
它与oh my world,hello world
oh my world,hello world
(虽然正则表达式是我的程序的首选方法,但如果您认为这不是一种可行的方法,那么欢迎使用任何其他python解决方案。)我认为这项任务最好通过一些编程逻辑来完成,而正则表达式将不会简单高效。但这里有一个正则表达式似乎在做你的工作,不管你是否有重复的单词(hello my world)出现
\b(hello|my|world)\b.*?((?!\1)\b(?:hello|my|world)\b).*?(?:(?!\1)(?!\2)\b(?:hello|my|world)\b)
这里的想法是
\b(hello | my | world)\b
并将其放入组1中((?!\1)\b(?:hello | my | world)\b
,然后将第二个匹配放在第二组中(?:(?!\1)(?!\2)\b(?:hello | my | world)\b)
hello my friend. This world
您可以将上述方法转换为函数以使其可重用。为什么需要正则表达式来解决此任务?@YassinHajaj欢迎其他建议,尽管在我正在使用的程序中更容易干净地安装正则表达式,因为我已经在同一程序中使用正则表达式来执行其他搜索任务method@CertainPerformancepython如果不允许重复模式,请重试。您需要的是每个成功匹配的第一个捕获组。您可以使用
regex
模块,如果它支持对相对捕获组的引用。这是一个超级智能、非常好的模块。您能解释一下re.I作为re.compile中的第二个参数吗?@datanoveler,欢迎,re.I
是re.IGNORECASE
选项的快捷方式这似乎很完美!将在一些测试后检查它是否正确。非常感谢。我想你可能会发现这很有趣:我在这里为我的项目制作了一个用可变词生成表达式的程序:@JocaPinto:太好了。是的,正则表达式是相当系统化和逻辑化的,这使我们能够通过代码生成它,而您做到了:)
hello my friend. This world