Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_String_Find - Fatal编程技术网

在Python中使用正则表达式搜索字符串

在Python中使用正则表达式搜索字符串,python,regex,string,find,Python,Regex,String,Find,当我尝试使用正则表达式在其他字符串中查找字符串时,它并没有按预期工作。以下是一个例子: import re message = 'I really like beer, but my favourite beer is German beer.' keywords = ['beer', 'german beer', 'german'] regex = re.compile("|".join(keywords)) regex.findall(message.lower()) 结果: ['bee

当我尝试使用正则表达式在其他字符串中查找字符串时,它并没有按预期工作。以下是一个例子:

import re
message = 'I really like beer, but my favourite beer is German beer.'
keywords = ['beer', 'german beer', 'german']

regex = re.compile("|".join(keywords))
regex.findall(message.lower())
结果:

['beer', 'beer', 'german beer']
但预期结果将是:

['beer', 'beer', 'german beer', 'german']
另一种方法是:

results = []
for k in keywords:
    regex = re.compile(k)
    for r in regex.findall(message.lower()):
        results.append(r)

['beer', 'beer', 'beer', 'german beer', 'german']

这是我想要的,但我认为这不是最好的方法。有人能帮我吗?

re.findall
找不到重叠的匹配项。如果要使用正则表达式,必须创建单独的表达式并在循环中运行它们,如第二个示例所示

请注意,您的第二个示例也可以缩短为以下内容,尽管您是否觉得这更具可读性取决于您的品味:

results = [r for k in keywords for r in re.findall(k, message.lower())] 

您的特定示例不需要使用正则表达式。如果只想查找固定字符串,则应避免使用正则表达式。

re.findall
在中介绍

“返回字符串中模式的所有非重叠匹配项…”

非重叠意味着对于“德国啤酒”,它将找不到“德国啤酒”和“德国啤酒”,因为这些匹配是重叠的。

我的清洁剂(为我)版本用于您的上一个解决方案

results = []
for key in keywords:
    results.extend(re.findall(key, message, re.IGNORECASE))

提问者不仅想测试一个特定的子字符串是否是字符串的一部分,还想测试一个特定子字符串的所有出现。在这种情况下,使用
re.findall()
是实现这一点的最佳方法。避免使用正则表达式会使这个解决方案变得更加困难。谢谢你们的回复。现在我知道我使用了一个错误的函数(findall),那么你建议如何查找匹配,包括重叠?@Adrián:你需要正则表达式的强大功能还是只想查找固定字符串?我想查找固定字符串,但我问正则表达式,因为我认为这是最好的方法(最佳方法).谢谢你的回复Omri Barel。您建议如何查找匹配项,包括重叠?通常,您必须执行您已经完成的操作:一次查找一个关键字。但是为了更好的解决方案,你必须描述你真正想要做的事情(即,在不简化为琐碎的例子的情况下,实际情况是什么)。Omri,正如我在下面的回答中所写的,我询问了正则表达式,因为我认为它是最好的和最佳的方法。查找的字符串将始终是固定的(word1 | word2 | word3…),我的意思是没有复杂的正则表达式。如果要搜索大量文本,可能值得一看Aho Corasick字符串匹配算法(),它同时查找一组字符串(包括重叠匹配)。否则,一次查找一个字符串就可以了。