代码之家  ›  专栏  ›  技术社区  ›  Heather

按任意顺序匹配字符串中可能的单词列表

  •  0
  • Heather  · 技术社区  · 4 年前

    我知道这个问题听起来与其他问题相似,但请参阅我下面关于这些解决方案的笔记。

    我需要一个正则表达式在Python中使用,以在字符串中按任何顺序搜索特定单词。我想做的是在单词序列周围放括号。

    以下是我的示例文本:

    苹果、梨、香蕉都是水果

    梨、苹果和香蕉在水果篮里

    你可以在水果沙拉中加入香蕉、梨和苹果

    他还喜欢吃梨、香蕉和苹果当零食

    她喜欢奶酪当零食,但也喜欢苹果或梨

    最终,我希望能够为水果系列加上括号,如下所示:

    [苹果、梨、香蕉]都是水果

    [梨、苹果和香蕉]在水果篮里

    你可以在水果沙拉中加入[香蕉、梨和苹果]

    他也喜欢(梨、香蕉和苹果)当零食

    她喜欢奶酪当零食,但也喜欢(苹果或梨)

    在我的研究中,我发现了以下帖子:

    Multiple words in any order using regex

    当我在Regex101中测试这个解决方案时,它什么也没做。

    Regex to match string containing two names in any order

    这个解决方案与第一个非常相似,也不起作用。

    Regex to match multiple words in any order

    这个解决方案经过一些细微的修改后,最接近于工作:

    (APPLES|BANANAS|PEARS) \[\1]\
    

    然而,这会在列出的每个水果周围加括号,而不是在系列周围加括号:

    [苹果]、[梨]、[香蕉]都是水果

    我显然缺少了一些东西,所以我很感激有人能给我任何帮助。

    谢谢!

    1 回复  |  直到 4 年前
        1
  •  3
  •   anubhava    4 年前

    您可以使用不区分大小写的开关将此正则表达式用于搜索:

    \b(?:apples|pears|bananas)(?:(?:\s+(?:or|and)\s+|\s*,\s*)+(?:apples|pears|bananas)\b)*
    

    并将其替换为: [\g<0>]

    RegEx Demo

    代码:

    import re
    
    regex = r"\b(?:apples|pears|bananas)(?:(?:\s+(?:or|and)\s+|\s*,\s*)+(?:apples|pears|bananas))*"
    
    subst = r"[\g<0>]"
    
    result = re.sub(regex, subst, test_str, 0, re.IGNORECASE)