regex 正则表达式:如何匹配字符串,但包含子字符串时除外

jexiocij  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(147)

我有以下问题:
我想提取的用户名或Facebook的链接ID像这样:

facebook.com/user.1?eav=AfZbZ7Edw
facebook.com/user2?eav=AfZbZ7Edw
facebook.com/profile.php?id=123456789&eav=AfbDMOIcUI0Q3Vj

结果是:

user.1
user2
123456789

使用regex我有这个模式,但不幸的是我不知道如何获得profile.php后的id
正则表达式模式:

facebook\.com/([a-zA-Z0-9_\.]+)?

我真的很感激任何帮助!

1cklez4t

1cklez4t1#

您可以选择匹配profile.php?,而不是将捕获组设置为可选:

facebook\.com/(?:profile\.php\?id=)?([\w.]+)

Regex demo

e5nqia27

e5nqia272#

要回答问题“如何匹配字符串,但包含子字符串时除外”,可以执行负向前查找以在存在profile.php时排除匹配项

facebook\.com/(?!profile\.php)([a-zA-Z0-9_\.]+)?

那么只有您提供的前两个URL匹配,输出(组1)将是前两个URL中的用户名。

text='''\
facebook.com/user.1?eav=AfZbZ7Edw
facebook.com/user2?eav=AfZbZ7Edw
facebook.com/profile.php?id=123456789&eav=AfbDMOIcUI0Q3Vj
'''
pattern = r'facebook\.com/(?!profile\.php)([a-zA-Z0-9_\.]+)?'
print(re.findall(pattern, text)) # ['user.1', 'user2']

但是简单地排除存在子字符串的情况并不能得到第三种情况下的ID,需要一种不同的方法。
作为The fourth bird answered,您可以使用可选的非捕获组来匹配profile.php?id=,以处理这两种情况。
可能看起来像这样:

pattern = r'facebook\.com/(?:profile\.php\?id=)?([a-zA-Z0-9_\.]+)?'
print(re.findall(pattern, text)) # ['user.1', 'user2', '123456789']

相关问题