Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式查找无序单词_Python_Regex - Fatal编程技术网

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
    ,然后将第二个匹配放在第二组中
  • 然后,它可以有选择地在它后面有零个或多个字符
  • 然后我们再次应用相同的逻辑,其中第三个单词应该是在group1或group2中未捕获的单词,因此这个正则表达式
    (?:(?!\1)(?!\2)\b(?:hello | my | world)\b)
  • 使用函数和对象的统一迭代pythonic方法:

    输出:

    hello my friend. This world
    


    您可以将上述方法转换为函数以使其可重用。

    为什么需要正则表达式来解决此任务?@YassinHajaj欢迎其他建议,尽管在我正在使用的程序中更容易干净地安装正则表达式,因为我已经在同一程序中使用正则表达式来执行其他搜索任务method@CertainPerformancepython如果不允许重复模式,请重试。您需要的是每个成功匹配的第一个捕获组。您可以使用
    regex
    模块,如果它支持对相对捕获组的引用。这是一个超级智能、非常好的模块。您能解释一下re.I作为re.compile中的第二个参数吗?@datanoveler,欢迎,
    re.I
    re.IGNORECASE
    选项的快捷方式这似乎很完美!将在一些测试后检查它是否正确。非常感谢。我想你可能会发现这很有趣:我在这里为我的项目制作了一个用可变词生成表达式的程序:@JocaPinto:太好了。是的,正则表达式是相当系统化和逻辑化的,这使我们能够通过代码生成它,而您做到了:)
    hello my friend. This world