0

我有一个模式,它正在寻找 word1 后跟 word2 后跟 word3 ,其间有任意数量的字符。但是,我的文件包含许多随机换行符和其他空白字符 - 这意味着在单词 1 和 2 或单词 2 和 3 之间可能有 0 个或多个单词和/或 0 个或多个随机换行符

为什么这段代码不起作用?(它不匹配任何东西)

strings = re.findall('word1[.\s]*word2[.\s]*word3', f.read())

[.\s]* - 我的意思是 - 多次查找 '.'(any char) 或 '\s'(newline char) (*)

4

2 回答 2

1

您的 reg ex 不起作用的原因是 reg ex-es 仅尝试在单行上匹配。他们在找到换行符 ( \n) 时停止并尝试从模式的开头开始匹配新行上的模式。

为了使 reg ex 忽略换行符,您必须将re.DOTALL其作为第三个参数添加到findall函数中:

strings = re.findall('word1.*?word2.*?word3', f.read(), re.DOTALL)
于 2013-04-02T00:06:15.753 回答
0

你有两个问题:

1).括号内没有任何特殊含义[]

[]改为使用您的(),如下所示:(.|\s)

2)\并不意味着您认为它在常规字符串中的作用。

尝试使用原始字符串:

re.findall(r'word1 ..blah..')

注意r字符串的前缀。

把它们放在一起:

strings = re.findall(r'word1(.|\s)*word2(.|\s)*word3', f.read())

但是,请注意这会更改返回的列表。

于 2013-04-02T00:03:04.923 回答