Python 用于排除某些单词,同时匹配其他单词的正则表达式

Python 用于排除某些单词,同时匹配其他单词的正则表达式,python,regex,Python,Regex,我正在使用python中的正则表达式(remodule)尝试匹配以下内容: 我的另一个要求是查找给定字符串中的所有匹配项。所以我使用的是re.findall() 我使用这个答案(并查看了许多其他SO页面)来构建我的正则表达式: regx='^(?。*(大豆杏仁))(?=$牛奶)).' 但当我用一个简单的例子测试它时,我得到了不正确的行为: >>> food = "is combined with creamy soy and milk. a fruity and re

我正在使用python中的正则表达式(
re
module)尝试匹配以下内容:

我的另一个要求是查找给定字符串中的所有匹配项。所以我使用的是
re.findall()

我使用这个答案(并查看了许多其他SO页面)来构建我的正则表达式:

regx='^(?。*(大豆杏仁))(?=$牛奶)).'

但当我用一个简单的例子测试它时,我得到了不正确的行为:

>>> food = "is combined with creamy soy and milk. a fruity and refreshing sip of spring, "
>>> re.findall(regx, food)
[]
>>> food = "is combined with creamy milk. a fruity and refreshing sip of spring, "
>>> re.findall(regx, food)
[('', 'milk')]
这两个函数都应该只返回
['milk']
。此外,如果我有多个milk实例,我只会得到一个结果,而不是两个:

>>> food = "is combined with creamy milk. a fruity and refreshing sip of milk, "
>>> re.findall(regx, food)
[('', 'milk')]
我在正则表达式中做错了什么,我应该如何调整它来解决这个问题?

对我很有用

(?:soy|almond)\s?[\w\(\)]+\s?(milk)
或不接受以下词语中的括号:

(?:soy|almond)\s?\w+\s?(milk)
在Python中,应该是这样的:

import re

matches = re.findall(r'(?:soy|almond)\s?[\w\(\)]+\s?(milk)', your_text)
对我有用

(?:soy|almond)\s?[\w\(\)]+\s?(milk)
或不接受以下词语中的括号:

(?:soy|almond)\s?\w+\s?(milk)
在Python中,应该是这样的:

import re

matches = re.findall(r'(?:soy|almond)\s?[\w\(\)]+\s?(milk)', your_text)

您可以通过匹配来排除
豆奶
豆奶
杏仁奶
杏仁奶`并在捕获组中仅捕获牛奶,该组将由返回

模式匹配:

  • \b
    防止部分匹配的单词边界
  • (?:大豆|杏仁)
    匹配大豆或杏仁
  • \s?milk\b
    匹配可选的空格char和milk,后跟单词边界
  • |
  • \b(牛奶)\b
    组1中捕获牛奶,并用单词边界包围
您也可以使用
[^\S\r\n]
而不是
\S
来匹配没有换行符的空格,因为后者可以匹配换行符

|

比如说

import re

regx = r"\b(?:soy|almond)\s?milk\b|\b(milk)\b"

food = "is combined with creamy soy and milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))

food = "is combined with creamy milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))
输出

['milk']
['milk']
另一个选择是使用

(?
模式匹配:

  • (?负回溯,断言直接在左边的不是
  • \b(?:大豆|杏仁)
    单词边界,匹配大豆或杏仁
  • \s*(?:milk)?
    匹配可选的空格字符,然后选择milk
  • 关闭后视
  • \bmilk\b
    在单词边界之间匹配milk

|

您可以通过匹配来排除
豆奶
豆奶
杏仁奶
杏仁奶`并在捕获组中仅捕获牛奶,该组将由返回

模式匹配:

  • \b
    防止部分匹配的单词边界
  • (?:大豆|杏仁)
    匹配大豆或杏仁
  • \s?milk\b
    匹配可选的空格char和milk,后跟单词边界
  • |
  • \b(牛奶)\b
    组1中捕获牛奶,并用单词边界包围
您也可以使用
[^\S\r\n]
而不是
\S
来匹配没有换行符的空格,因为后者可以匹配换行符

|

比如说

import re

regx = r"\b(?:soy|almond)\s?milk\b|\b(milk)\b"

food = "is combined with creamy soy and milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))

food = "is combined with creamy milk. a fruity and refreshing sip of spring, "
print(re.findall(regx, food))
输出

['milk']
['milk']
另一个选择是使用

(?
模式匹配:

  • (?负回溯,断言直接在左边的不是
  • \b(?:大豆|杏仁)
    单词边界,匹配大豆或杏仁
  • \s*(?:milk)?
    匹配可选的空格字符,然后选择milk
  • 关闭后视
  • \bmilk\b
    在单词边界之间匹配milk

|

也许
(?对你有用。我不确定你是否仔细考虑了这一点。那么“…对杏仁产业来说。许多牧场主发现牛奶是一种提神饮料。”?应该匹配吗?如果不匹配,为什么不匹配?@TimRoberts这是我的问题还是Wiktor的问题?对于我非常具体的用例,这需要匹配,因为它属于“…杏仁单词(s)milk…”。其中单词(s)是任意数量的单词。也许
(?对你有用。我不确定你是否已经考虑清楚了。你呢“…对于杏仁行业来说。许多牧场主发现牛奶是一种提神饮料。”?这是否匹配?如果不匹配,为什么不匹配?@TimRoberts这是我还是Wiktor的问题?对于我非常具体的用例,这需要匹配,因为它属于“…杏仁词牛奶…”一类。词在哪里是任意字数。它匹配杏仁奶的空字符串,而不是不匹配的
>>>food=“与奶油杏仁奶混合。春天的水果清爽小口,”>>>re.findall(regx,food)['''']
@TayyarR您可以从最终列表中删除空匹配项,如
print([m代表re.findall(regx,food),如果m])
请参见“谢谢”!是否每次出现不需要的匹配时都会显示空字符串(almond代表ex)或者在其他情况下,这会返回一个空字符串吗?这有点像noob问题:有没有办法构建正则表达式,以便在列表中只返回真正的匹配项?@TayyarR这是排除您不想要的内容并捕获您想要的内容的技术的一部分。您可以使用列表理解来删除空字符串例如字符串。@TayyarR如果您可以使用,您可以使用它匹配杏仁奶的空字符串,而不是不匹配的
>>food=“与奶油杏仁奶混合。一口清新的春天水果味,”>>>re.findall(regx,food)['']
@TayyarR您可以从最终列表中删除空匹配项,如
print([m代表re.findall(regx,food)中的m(如果是m])
请参见“谢谢”!是否每次出现不需要的匹配时都会显示空字符串(almond代表ex)或者在其他情况下,这会返回一个空字符串吗?这有点像noob问题:有没有办法构建正则表达式,以便在列表中只返回真正的匹配项?@TayyarR这是排除您不想要的内容并捕获您想要的内容的技术的一部分。您可以使用列表理解来删除空字符串例如字符串。@TayyarR如果可以使用,则可以使用