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