【问题标题】:Why is ^\d+$ matching a string that is fully numeric?为什么 ^\d+$ 匹配一个完全数字的字符串?
【发布时间】:2017-08-05 02:05:25
【问题描述】:

以下正则表达式

moo = re.compile(r'^\d+$')

将搜索仅以数字字符开头和结尾的字符串。示例可以是1123444332123321321 等。

但正则表达式与 12321xyz12312 不匹配。该字符串也以数字开头和结尾,这就是我的正则表达式匹配字符串所需的全部内容!那为什么我的正则表达式不匹配这个字符串呢?

【问题讨论】:

  • "正则表达式 moo=re.compile(r'^\d+$') 将搜索仅以数字字符开头和结尾的字符串。" - 不。如果你能解释你为什么这么想,我们就能解释你的误解。
  • 如果你想匹配一个以数字开头和结尾的字符串,中间不关心什么,你使用re.compile(r'^\d.*\d$')
  • @cᴏʟᴅsᴘᴇᴇᴅ:除了不匹配像'1'这样的单个数字字符串,所以如果你想匹配那些(你可能会),你需要特殊情况或使用环视断言或不使用正则表达式或其他东西。
  • @user2357112 谢谢。 r'^(?:\d.*\d)|\d$'

标签: python regex python-3.x


【解决方案1】:

我认为你误解了开始和结束匹配器的工作原理。

^\d+$ 不只是匹配以数字结尾和开头的字符串。就是这么说的:

  • 转到字符串的开头 (^)
  • 匹配一个数字 (\d)
  • 尽可能多地匹配这些数字 (+)
  • 现在继续尝试匹配这些直到字符串的末尾 ($)

12321xyz12312 不匹配,因为在匹配12321 之后,它会尝试匹配字符串的结尾。但是还没到最后,所以字符串不匹配!

这是一个可以满足您需求的正则表达式:

^\d(.*\d)?$

该表达式将匹配以下内容:

YES  0 
 NO  x0
 NO  0x
YES  00
YES  000
YES  0x0
YES  00x00
YES  000xxx000

【讨论】:

  • 能否请你给我一个正则表达式,它会匹配一个两端都有数字的字符串,不管它里面有什么字符?
  • @M.Hamel 你看到我的comment
  • 我已经更新了正则表达式。之前的那个不需要正确的数字。
  • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢!
  • @Soviut 您可能应该编写自己的答案,而不是编辑这个用户的这个程度......
【解决方案2】:

"^\d+$" 表示“在开头 "^" 和结尾 "$" 之间的一个或多个十进制数字 "\d+"。” xyz 不是十进制数字。

【讨论】:

    【解决方案3】:

    我认为您误解了正则表达式。它匹配“字符串开头”(^)紧跟“一个或多个 0-9 字符”(\d+ -- \d[0-9]0|1|2|3|4|5|6|7|8|9 相同,+ 表示“重复一次或多次”) 紧接着是“字符串结尾” ($)。

    也就是说,^ ... $ 的意思是“只匹配与 ... 完全相同的字符串”(而不是“匹配在某处包含它的字符串”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 2013-05-21
      • 2021-11-22
      相关资源
      最近更新 更多