Python 用于排除某些单词,同时匹配其他单词的正则表达式
我正在使用python中的正则表达式(Python 用于排除某些单词,同时匹配其他单词的正则表达式,python,regex,Python,Regex,我正在使用python中的正则表达式(remodule)尝试匹配以下内容: 我的另一个要求是查找给定字符串中的所有匹配项。所以我使用的是re.findall() 我使用这个答案(并查看了许多其他SO页面)来构建我的正则表达式: regx='^(?。*(大豆杏仁))(?=$牛奶)).' 但当我用一个简单的例子测试它时,我得到了不正确的行为: >>> food = "is combined with creamy soy and milk. a fruity and re
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
匹配大豆或杏仁(?:大豆|杏仁)
匹配可选的空格char和milk,后跟单词边界\s?milk\b
或|
在组1中捕获牛奶,并用单词边界包围\b(牛奶)\b
[^\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如果可以使用,则可以使用