如何传递正则表达式重复的参数(python)

时间:2018-03-20 20:39:19

标签: python regex repeat

我正在学习正则表达式。如果我想在字符串中找到所有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未被识别。

如何使用重复次数(或者在这种情况下,单词的长度)指定一个参数?

3 个答案:

答案 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的所有单词。

See code in use here

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']