如何传递regex重复的参数(python)

2024-09-28 23:19:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在学习regex。如果我想在一个字符串中找到所有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。你知道吗

如何用重复次数(或者在本例中是单词的长度)指定参数?你知道吗


Tags: the字符串textimportrequick单词lazy
3条回答

这比你想象的要简单。“regex字符串”没有什么特别之处:它是一个简单的、基本的、日常的文本字符串。唯一值得注意的是,它通常是用r前缀定义的,因为反斜杠在(不固定的)Python字符串中也意味着一些东西,您不想将它们加倍,而且。。。它按原样输入Python的内部regex模块。你知道吗

所以这根线从哪里来并不重要!任意构造,然后将结果输入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的重复使用,因为它不是regex特性,而是Python特性,您需要在all前面加上前缀来分隔字符串,以防止反斜杠猖獗地运行并弄乱精心构造的表达式。你知道吗

(此函数的输入也是如此。这也会起作用,除非您测试参数并拒绝非数字:

>>> findwords(text, '5} {1')
['quick ', 'brown ', 'jumps ']

。。。但我没有。)

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

这可以很容易地完成,而无需生成regex模式。只需提取所有单词,然后使用列表理解来收集所有长度为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']

相关问题 更多 >