python - Perl 和 Python 之间正则表达式行为的差异?

标签 python regex perl

我有几个电子邮件地址,'support@company.com''1234567@tickets.company.com'

在 perl 中,我可以使用原始电子邮件的 To: 行找到上述任一地址

/\w+@(tickets\.)?company\.com/i

在 python 中,我只是将上面的正则表达式写为 '\w+@(tickets\.)?company\.com' 期望得到相同的结果。但是,根本找不到 support@company.com,第二个 findall 返回一个仅包含 'tickets.' 的列表。很明显 '(tickets\.)?' 是问题所在,但是我遗漏的 Perl 和 Python 之间的正则表达式规则到底有什么区别?

最佳答案

re.findall 的文档:

findall(pattern, string, flags=0)
    Return a list of all non-overlapping matches in the string.

    If one or more groups are present in the pattern, return a
    list of groups; this will be a list of tuples if the pattern
    has more than one group.

    Empty matches are included in the result.

由于 (tickets\.) 是一个组,findall 返回该组而不是整个匹配项。如果你想要整个匹配,围绕整个模式放置一个组和/或使用非分组匹配,即

r'(\w+@(tickets\.)?company\.com)'
r'\w+@(?:tickets\.)?company\.com'

请注意,在第一种情况下,您必须从 findall 返回的每个元组中挑选出第一个元素。

关于python - Perl 和 Python 之间正则表达式行为的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/757476/

相关文章:

python - 值错误 : Num gradients 1 generated for op name: "mask/Mask"

python - numpy 中 3D 数组的 2D 切片系列

perl - 如果一个进程被 sigkill 杀死,我该如何让它再次运行?

perl - 如何在 Perl 脚本的两个分支部分之间建立 IP 通信

perl - 如何选择使用 Catalyst Framework 处理表单的工具?

Python - 如何插入 NULL mysql 值

python - 我收到错误 AttributeError : 'Updater' object has no attribute 'dispatcher'

javascript - 使用整数或分数值将 px 转换为 mm

python - 正则表达式:如何在否定前瞻之前引入非贪婪运算符

java - 从正则表达式在 Android 中创建对象