Python re.findall()不';t与之匹配';s发现
我有一个文本文件,其中包含如下行:Python re.findall()不';t与之匹配';s发现,python,regex,string,Python,Regex,String,我有一个文本文件,其中包含如下行: <pattern number=1 theme=pseudo> <pattern number=2 theme=foo> <pattern number=3 theme=bar> 假设它返回了 当我用这个条件检查它时,它返回False if find_random_pattern("pseudo") == "<pattern number=1 theme=pseudo>": return True el
<pattern number=1 theme=pseudo>
<pattern number=2 theme=foo>
<pattern number=3 theme=bar>
假设它返回了
当我用这个条件检查它时,它返回False
if find_random_pattern("pseudo") == "<pattern number=1 theme=pseudo>":
return True
else:
return False
如果查找随机模式(“伪”)=“”:
返回真值
其他:
返回错误
为什么这两个字符串不匹配?您希望
re.findall
返回整行,但返回匹配的部分:
>>> line = "<pattern number=1 theme=pseudo>"
>>> import re
>>> re.findall("theme=pseudo", line)
['theme=pseudo']
更简洁的解决方案是:
import random
import re
import string
def find_random_pattern(theme):
lines = open('poempatterns.txt','r').readlines()
stripped_lines = map(string.strip, lines)
found_lines = filter(lambda l: re.match(".*theme=%s.*" % theme, l), stripped_lines)
return random.choice(found_lines)
re.findall
只返回匹配项,而不是整个行
。
引述自:
re.findall(pattern,string,flags=0)返回所有不重叠的
字符串中模式的匹配,如字符串列表。字符串是
从左到右扫描,并按找到的顺序返回匹配项。如果
如果模式中存在一个或多个组,则返回
组;如果模式有多个元组,这将是一个元组列表
小组。空匹配项包括在结果中,除非它们与
另一场比赛的开始
演示:
>>> s = 'Good morning Gotham!'
>>> re.findall('Go', s)
['Go', 'Go']
也就是说,如果您的要求是查找主题是否存在于行中,那么您确实不需要正则表达式
:
def find_random_pattern(theme):
with open('poempatterns.txt','r') as pattern:
found_lines = [line for line in pattern if theme in line]
selectedline = random.choice(found_lines)
return selectedline
如果您只是在行中检查theme=pseudo
,那么我真的不明白您为什么需要regex
,只是中的是一个足够的提示:如果执行打印(查找随机模式(“pseudo”)
,会发生什么?(或print(re.findall(…))
)第一个函数也返回false,但第二个函数有效。非常感谢。
import random
import re
import string
def find_random_pattern(theme):
lines = open('poempatterns.txt','r').readlines()
stripped_lines = map(string.strip, lines)
found_lines = filter(lambda l: re.match(".*theme=%s.*" % theme, l), stripped_lines)
return random.choice(found_lines)
>>> s = 'Good morning Gotham!'
>>> re.findall('Go', s)
['Go', 'Go']
def find_random_pattern(theme):
with open('poempatterns.txt','r') as pattern:
found_lines = [line for line in pattern if theme in line]
selectedline = random.choice(found_lines)
return selectedline