【问题标题】:How to use regex in python? [duplicate]如何在python中使用正则表达式? [复制]
【发布时间】:2018-04-08 10:48:30
【问题描述】:

我一定遗漏了一些简单的东西 - 无论我做什么,我都无法让我的正则表达式匹配任何字符串:

[~] $ python2.7
Python 2.7.12 (default, Aug 13 2016, 19:37:25) 
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> s = "   405489796130    "
>>> regex = "\b[0-9]{15}|[0-9]{12}\b"
>>> for str in re.findall(regex, s):
...     print(str)
... 
>>> for str in re.finditer(regex, s):
...     print(str)
... 
>>> print("Hi")
Hi
>>> 

正则表达式 "\b[0-9]{15}|[0-9]{12}\b" 应该明确匹配提供的字符串(该字符串包含 12 位数字的子字符串...)。

我什至将这段文本和正则表达式放入https://regexr.com/ 并且该网站的正则表达式找到了子字符串 - 为什么 Python 不能?

【问题讨论】:

  • 我几乎不是正则表达式专家;我咨询documentation。
  • 查看 print("\b") ... 注意,反斜杠是 Python 中的 转义序列。使用 原始字符串 所以 Python 不会解释转义序列:print(r"\b") 或使用双重转义:print("\\b")
  • 请查看我的答案以获得正确的解决方案,mypetlion 的解决方案不正确。我解释了原因。

标签: python regex python-2.7 python-2.x


【解决方案1】:

你必须避开你的反斜杠。

regex = "\\b[0-9]{15}|[0-9]{12}\\b"

【讨论】:

  • 使用 r 字符串。这就是为什么您会在 Python 中看到几乎所有正则表达式示例都在使用它们(除了没有使用反斜杠的情况。regex = r"\b[0-9]{15}|[0-9]{12}\b"
  • 我总是使用 \\.我认为这只是我占少数的偏好。
  • 二次使用r。这就是它的用途,并且在 Python 的文档中特别建议将其作为该问题的解决方案。为什么你更喜欢在开头使用双反斜杠而不是简单的开关?
【解决方案2】:

正则表达式模式必须是原始字符串,在 Python 中,您声明一个带有 r 前缀的原始字符串,如下所示:

import re
s = "   405489796130    "
regex = r"\b[0-9]{15}|[0-9]{12}\b"
for match in re.findall(regex, s):
    print(match)

>>> 405489796130

编辑

[已删除附加指南]

【讨论】:

  • 将其他人的解决方案复制到您自己的答案不是一个好主意。如果您看到其他人的答案是正确的而您的不是,您应该删除它并为正确的答案投票。
  • @WiktorStribiżew 我试图评论说它可以在您的答案没有更正语法的情况下工作,但 SO 需要 50 多个声誉才能发表评论。考虑到限制,我做得正确
  • 正确的方法是发布自己的好答案以获得 50 分(甚至更多)。请从您的答案中删除我的解决方案。
  • @WiktorStribiżew 更正的语法无法回答问题,因为没有它也可以工作。这不是给定问题的解决方案,它只是额外的指导。
  • Here is your regex demo,它实际上匹配任何包含开头 12 位数字或结尾包含 15 位数字的字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2019-06-17
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多