使用正则表达式re.search和re.compile时的问题

0 投票
1 回答
1009 浏览
提问于 2025-04-18 08:14

一个Stack Overflow的用户很友好地向我推荐了https://pythex.org/,这个网站可以帮助你构建和测试正则表达式。

我已经成功写出了正则表达式,但在用Python的re模块实际使用时,我有点困惑。

我不明白的是,什么时候用.compile,什么时候用re.search。

比如说,如果我想找括号里的文本,而且有多个这样的文本,我知道我应该用.group[x],其中x是你想返回的项目的索引。

举个例子

pattern = re.compile(r'View All \((\d*)\)')
number = pattern.search(data).group(2);

根据我的理解,如果我有以下内容,number_connections变量在打印时会是

View All (8) View All (16) View All (12)

结果

Print number
16

我不明白的是:当你要找的文本出现多次时,怎么循环遍历它们?还有,怎么统计有多少个?

For example: number.count() would return, found 3
for i in number: (this doesn't work because match is a regular expression object???)
    print i    

但是当你要找的文本在正则表达式中只有一个时,会发生什么呢?

举个例子

正则表达式: pattern = re.compile('[a-zA-Z]\s[a-zA-Z]/[a-zA-Z]/[a-zA-Z]') email = pattern.search(data).group(1);

结果

data: "email-id":"FisrtName LastName/Australia/ABC"}]</p></body></html>
should return: firstname lastname/Australia/ABC

页面上可能有多个这样的文本,也可能只有一个。在这种情况下,总是使用result[0]可能不行,因为页面上可能只有一个电子邮件地址。

现在我意识到我的语法显然是错的,但这样做也给了我以下结果,所以我在寻找如何在用https://pythex.org/构建正则表达式后,正确使用它的指导:

email = pattern.search(data)
print email

<_sre.SRE_Match object at 0x0553B090>

1 个回答

3

听起来你在学习Python的正则表达式时,可能需要看看一些文档或完整的教程,而不是试图从零散的知识中拼凑起来。

无论你是否编译正则表达式,你都能得到完全相同的匹配结果。

引用Jan Goyvaerts,他是RegexBuddy的作者,也是《正则表达式食谱》的合著者:

如果你想多次使用同一个正则表达式,最好把它编译成一个正则表达式对象。正则表达式对象更高效,也让你的代码更易读。要创建一个对象,只需调用re.compile(regex)或re.compile(regex, flags)。这些flags是之前提到的用于re.search()和re.match()函数的匹配选项。

re.compile()返回的正则表达式对象提供了re模块直接提供的所有功能:search()、match()、findall()、finditer()、sub()和split()。不同之处在于,它们使用存储在正则表达式对象中的模式,而不需要将正则表达式作为第一个参数。re.compile(regex).search(subject)等同于re.search(regex, subject)。

如果你需要多个匹配,可以使用findallfinditer(更多详细信息可以在同一页面找到)。

撰写回答