【问题标题】:Match a list of possible words in a string in any order以任意顺序匹配字符串中可能出现的单词列表
【发布时间】:2021-04-12 10:07:32
【问题描述】:

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

我需要一个在 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]\

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

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

我显然遗漏了一些东西,所以如果有人能给我任何帮助,我将不胜感激。

谢谢!

【问题讨论】:

  • (?i)\b(?:APPLES|BANANAS|PEARS)\b(?:\s*(?:,\s*)?(?:(?:or|and)\s+)?(?:APPLES|BANANAS|PEARS))*\b 并替换为[\g<0>],参见regex101.com/r/RKv9ci/1

标签: python regex


【解决方案1】:

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

\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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 2022-01-18
    • 2017-06-12
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2020-12-03
    相关资源
    最近更新 更多