带负lookahead的Python regex

2024-05-01 22:08:31 发布

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

嗨与python我想捕捉电话号码在文本,但要排除那些后面的话传真或传真。在

我使用以下正则表达式,如果句子以Fax或Fax开头,则有效,但如果Fax在句中则不起作用:

^(?!fax|Fax)(?:.*?)(?![-a-z])((?:[^0-9])((\+|00)33\s?|0|\(0\))[123456789][ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2}[ \.\-]?[0-9]{2})(?![0-9])

下面是我分析的一个文本示例:

^{pr2}$

我的正则表达式的结果是:

Match 1
Full match  5-42    `Adresse quai du Sa fax 06 32 32 32 33`
Group 1.    27-42   ` 06 32 32 32 33`
Group 2.    28-29   `0`
Match 2
Full match  72-117  `faTel : 0 8 99 70 1761 – Fax : 06 32 32 32 34`
Group 1.    102-117 ` 06 32 32 32 34`
Group 2.    103-104 `0`
Match 3
Full match  118-157 `Mail :support@domain.com
06 32 32 32 35`
Group 1.    142-157 `
06 32 32 32 35`
Group 2.    143-144 `0`
Match 4
Full match  178-196 `tel 06 32 32 32 37`
Group 1.    181-196 ` 06 32 32 32 37`
Group 2.    182-183 `0`

但我不想在结果中出现“0632323234”和“063232333”,因为“传真”在前面。。。在

谢谢


Tags: 文本示例matchsagroup电话号码full句子
2条回答

您使用的是lookahead而不是lookbehind (?<!..)

有了这个regex,我似乎可以得到所有的电话号码而没有传真号码:

(?<!Fax |fax )((\d\d\s){5}|((\d\s){2}(\d\d\s){2}\d{4}))

我建议使用一个正则表达式,它将匹配您不需要的内容,但将匹配并捕获您需要的内容:

(?i)fax\W*\d[\s\d]*|(\d[\s\d]*\d)

参见regex demo。绿色突出显示的物品是你需要抓住的。注意:您将在第1组中得到的数字应至少包含2位数字。另外,您可以根据进一步的要求来精确化模式,只需使用相同的“框架”,因为我试图简化regex结构以显示主要概念。在

详细信息

  • (?i)-不区分大小写的修饰符
  • fax-子串fax
  • \W*-任何0+非单词字符(您可以精确地将其精确到只使用空格和冒号,例如\s*(?::\s*)?
  • \d-一个数字
  • [\s\d]*-0+空格或数字
  • |-或者。。。在
  • (\d[\s\d]*\d)-组1(需要的值)
    • \d-一个数字
    • [\s\d]*-0+空格或数字
    • \d-一个数字

Python在2中使用

^{pr2}$

参见Python 2 demo

相关问题 更多 >