我正在学习正则表达式。如果我想在字符串中找到所有5个字母的单词,我可以使用:
import re
text = 'The quick brown fox jumps over the lazy dog.'
print(re.findall(r"\b[a-zA-z]{5}\b", text))
但我想写一个简单的函数,其参数包括字符串和找到的单词的长度。我试过这个:
import re
def findwords(text, n):
return re.findall(r"\b[a-zA-z]{n}\b", text)
print(findwords('The quick brown fox jumps over the lazy dog.', 5))
但是这会返回一个空列表。 n
未被识别。
如何使用重复次数(或者在这种情况下,单词的长度)指定一个参数?
答案 0 :(得分:5)
Python并没有神奇地将n
的值填充到字符串中。为此,您需要使用format
:
r"\b[a-zA-z]{{{}}}\b".format(n)
或者,如果您运行的是Python> = 3.6,请使用新的f-strings(可以与表示原始字符串的r
前缀结合使用):
fr"\b[a-zA-z]{{{n}}}\b"
在这两种情况下,您需要外部两个{{}}
来创建文字{}
,而内部是格式占位符。
如果你想避免逃避文字{}
,你可以使用较旧的%
格式来实现同样的目的。对于这个n
需要始终是一个整数(它在这里):
r"\b[a-zA-z]{%i}\b" % n
答案 1 :(得分:4)
这比你意识到的要简单。 “正则表达式字符串”没有什么特别之处:它是一个简单的,基本的日常文本字符串。关于唯一远程卓越的事情是通常使用r
前缀定义,因为反斜杠意味着(未加前缀的)Python字符串中的某些内容,并且您不希望加倍这些,并且......它按原样输入到Python的内部正则表达式模块中。
所以字符串来自哪里,并不重要!按照您喜欢的方式构建它,然后将结果提供给re.findall
:
def findwords(text, n):
return re.findall(r"\b[a-zA-z]{" +str(n) + r"}\b", text)
>>> findwords(text, 3)
['The', 'fox', 'the', 'dog']
>>> findwords(text, 4)
['over', 'lazy']
请注意r
的重复使用,因为它不是正则表达式的特性而是Python版本,并且您需要在其中添加所有单独的字符串,以防止反斜杠运行猖獗和混乱你精心构造的表达。
(对于此函数的输入也是如此。这也可以,除非你测试参数并拒绝非数字:
>>> findwords(text, '5} {1')
['quick ', 'brown ', 'jumps ']
......我没有。)
答案 2 :(得分:2)
这可以非常容易地完成,而不会生成正则表达式模式。只需简单地提取所有单词,然后使用列表理解来收集长度为n
的所有单词。
import re
text = 'The quick brown fox jumps over the lazy dog.'
words = re.findall(r"[a-zA-Z]+", text)
print([w for w in words if len(w) == 3])
结果:['The', 'fox', 'the', 'dog']