Python正则负向零宽断言不能贪婪匹配

从字符串中提取@用户名,假设字符串中混有email,并且@用户名之间没有空格就无法使用单词边界

# -*- coding:utf-8 -*-
import regex

m = 'a@bc.com t@abc-inc.com @编程 @python@coding'
p = regex.findall(r'@[\u4e00-\u9fa5\w]+(?![\.-])', m)
print(p)

我尝试用了负向零宽断言,但是匹配结果是
[‘@b’, ‘@ab’, ‘@编程’, ‘@python’, ‘@coding’]
前两项不应该匹配,如何解决?我看了python如果用了负向零宽断言就不能贪婪匹配

Jason990420
最佳答案

前两项应该匹配!因为后面并没有[.-]

import re

m = r'a@bc.com t@abc-inc.com @编程 @python@coding'
p = re.findall(r'@\w+(?!.*[.-])', m)
print(p)
['@编程', '@python', '@coding']
1年前 评论
讨论数量: 3
Jason990420

前两项应该匹配!因为后面并没有[.-]

import re

m = r'a@bc.com t@abc-inc.com @编程 @python@coding'
p = re.findall(r'@\w+(?!.*[.-])', m)
print(p)
['@编程', '@python', '@coding']
1年前 评论
import re

m = '@编程 @python@coding a@bc t@abc-inc.com'
p = re.findall(r'@\w+(?!.*[.-])', m)

print(p)

换个顺序就有问题,会导致前面的项也无法匹配
为什么?!后要有.*,负向断言不就可以匹配.-之前的字符了吗?

m = '@编程 @python@coding a@bc.com @t@abc-inc.com@ricky'
p = re.findall(r'@\w+(?![.-])\b', m)

这样结果就没问题

1年前 评论
Jason990420

写正则式之前, 必须要先确定匹配的规则, 而不是以某一个特定的字符串来写正则式, 再换一个字符串, 其结果很可能会不一样. 以下三个不同的字符串, 可以使用多个不同的正则式得到匹配, 其结果很可能互相都不同.

m = r'a@bc.com t@abc-inc.com @编程 @python@coding'
m = r'@编程 @python@coding a@bc t@abc-inc.com'
m = r'@编程 @python@coding a@bc.com @t@abc-inc.com@ricky'
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!