Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 findall正则表达式_Python_Regex_Python 3.x - Fatal编程技术网

python findall正则表达式

python findall正则表达式,python,regex,python-3.x,Python,Regex,Python 3.x,我得到了一个长字符串,我需要找到包含字符“d”和后面的字符“e”的单词 l=[" xkn59438","yhdck2","eihd39d9","chdsye847","hedle3455","xjhd53e","45da","de37dp"] b=' '.join(l) runs1=re.findall(r"\b\w?d.*e\w?\b",b) print(runs1) \b是单词的边界,后跟任何字符(\w?)等。 我得到一个空列表。通过对每个字符串分别应用基于正则表达式的搜索,您可以大大简化

我得到了一个长字符串,我需要找到包含字符“d”和后面的字符“e”的单词

l=[" xkn59438","yhdck2","eihd39d9","chdsye847","hedle3455","xjhd53e","45da","de37dp"]
b=' '.join(l)
runs1=re.findall(r"\b\w?d.*e\w?\b",b)
print(runs1)
\b是单词的边界,后跟任何字符(\w?)等。
我得到一个空列表。

通过对每个字符串分别应用基于正则表达式的搜索,您可以大大简化您的解决方案

>>> p = re.compile('d.*e')
>>> list(filter(p.search, l))
或者


为什么
re.findall
不起作用?你在搜索一个大字符串,中间的贪婪匹配在字符串中搜索。解决办法应该是

>>> re.findall(r"\b\S*d\S*e\S*", ' '.join(l))
['chdsye847', 'hedle3455', 'xjhd53e', 'de37dp']

使用
\S
匹配任何非空格的内容。

类似的内容可能

\b\w*d\w*e\w*

请注意,您可能可以在此处删除单词边界,因为
第一个
\w
保证前面有一个单词边界


同样的
\w*d\w*e\w*

您可以过滤结果:

import re
l=[" xkn59438","yhdck2","eihd39d9","chdsye847","hedle3455","xjhd53e","45da","de37dp"]

pattern = r'd.*?e'

print(list(filter(lambda x:re.search(pattern,x),l)))
输出:

['chdsye847', 'hedle3455', 'xjhd53e', 'de37dp']

您的字符串只是单词,为什么还需要单词边界?为什么不对列表中的每个单词分别应用正则表达式?为什么
将它们连接成一个巨大的字符串?@Aran Fey进行搜索我成功地完成了一个for循环,只是想了解如何使用re.findall。你为什么要加入它?这使您的解决方案变得更加复杂,使用复杂的正则表达式搜索一个大字符串可能会比使用简单的正则表达式搜索较小的字符串更糟糕。@coldspeed是的,我知道,我只是想了解如何使用re.findall,但不明白我的表达式为什么不起作用。我已经通过re.search对较小表达式的for循环做了相同的操作。谢谢,您能解释一下为什么我的表达式没有实现相同的功能吗?@david007killer,因为它是错误的?那你为什么坚持要加入这个阵营?这里是否有一些您决定在回答中不提及的秘密要求?您的正则表达式有这个部分
*
,它将匹配非单词,并且也是贪婪的。因为这个正则表达式将字符限制为单词。这将被认为是一个纯粹的答案,不受字符串或变量的影响。@coldspeed我已经回答了您上面的问题,很抱歉我没有正确地阐明我的意图。@sln谢谢。这基本上与相同,但更丑陋,效率更低。拥有一个非贪婪的捕获组对这么小的字符串没有影响。谢谢你的评论兄弟,我只是尝试了我的方法,因为我想帮助你,但如果你不喜欢,我可以删除:)
import re
l=[" xkn59438","yhdck2","eihd39d9","chdsye847","hedle3455","xjhd53e","45da","de37dp"]

pattern = r'd.*?e'

print(list(filter(lambda x:re.search(pattern,x),l)))
['chdsye847', 'hedle3455', 'xjhd53e', 'de37dp']