gpt4 book ai didi

python - 将正则表达式与整个字符串匹配,而不仅仅是字符串的一部分

转载 作者:行者123 更新时间:2023-12-01 01:07:09 27 4
gpt4 key购买 nike

我有一个正则表达式:r'((\+91|0)?\s?\d{10})'

我正在尝试匹配 +91 1234567890123456779001234567890 等数字。

这些数字不应匹配:1234568901112,因为它不是以 +91 或 0 开头,或者不只有 10 个数字:

当我尝试使用re.findall()时:

re.findall(r'((\+91|0)?\s?\d{10})', '+91 1234567890, 1234567790, 01234567890, 1234568901112')
[('+91 1234567890', '+91'),
(' 1234567790', ''),
(' 0123456789', ''),
(' 1234568901', '')]

您可以注意到,在第三个和第四个索引中,输出不是我想要的。我在第三个索引处的预期输出是 01234568890,因为它以 0 开头,后跟 10 个字符。但它只显示前 10 个字符。另外,我不希望第四个索引中的输出,因为它的数字不完全匹配。因此,它要么匹配完整的单词/字符串,要么无效。

还有其他我可以使用的正则表达式吗?还是一个函数?我在这里做错了什么?

预期输出是:

[('+91 1234567890','1234567790', '01234567890']

如果需要更多说明,请告诉我。

最佳答案

您可以使用

r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b'

请参阅 regex demo

重点是将这些模式作为整个单词进行匹配,问题是第一部分是可选的,并且可选替代项之一以非单词字符开头,因此单个 \b 单词边界在这里不起作用。

详细信息

  • (?<!\w) - 当前位置左侧不应有单词字符
  • (?:(?:\+91|0)\s?)? - 可选出现的
    • (?:\+91|0) - +910
    • \s? - 可选的空格
  • \d{10}\b - 十位数字匹配整个单词,两侧不允许出现单词字符

Python demo:

import re
s = '+91 1234567890, 1234567790, 012345678900, 1234568901112, 01234567890'
print(re.findall(r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b', s))
# => ['+91 1234567890', '1234567790', '01234567890']

关于python - 将正则表达式与整个字符串匹配,而不仅仅是字符串的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55238488/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com