【问题标题】:How to match a full string, instead of partial string? [duplicate]如何匹配完整字符串,而不是部分字符串? [复制]
【发布时间】:2020-10-15 05:03:51
【问题描述】:
pattern = (1|2|3|4|5|6|7|8|9|10|11|12)

str = '11'

这仅匹配“1”,而不匹配“11”。如何匹配完整的'11'?我把它改成:

pattern = (?:1|2|3|4|5|6|7|8|9|10|11|12)

是一样的。

我先在这里测试:

https://regex101.com/

【问题讨论】:

  • 能否请您发布您用于执行这些测试的代码?
  • 将较长的输入放在前面 - (10|11|12|1|2|3) 而不是 (1|2|3|10|11|12)。选项在“或”链中越早,优先级越高,因为检查会短路。
  • 事实上,您的替换现在应该匹配 1 和 11。请在此处包含相关的 Python 代码。
  • @AmbrishPathak,是的,我可以使用 '^' 和 '$' 来标记边界。
  • 顺便说一句,正则表达式并没有真正的先例顺序,每个构造执行一个原子动作,从左到右。

标签: python regex


【解决方案1】:

它匹配1 而不是11,因为您在11 之前有1。如果您使用re.findall,那么它将匹配1 两次 输入字符串11

不过,为了匹配 1 到 12 的数字,您可以避免交替使用:

\b[1-9]|1[0-2]?\b

使用单词边界来避免单词数字内的匹配会更安全。

RegEx Demo

【讨论】:

    【解决方案2】:

    正则表达式总是从左到右匹配。
    在交替时,您会将最长的放在第一位。

    但是,应优先考虑保理。

    (1|2|3|4|5|6|7|8|9|10|11|12)

    然后变成

    1[012]?|[2-9]

    https://regex101.com/r/qmlKr0/1

    我故意没有将边界部分添加为 每个人都有自己的喜好。

    【讨论】:

      【解决方案3】:

      你是说这个解决方案吗?

      [\d]+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 2011-06-17
        • 2017-05-26
        • 1970-01-01
        • 2019-06-09
        • 2018-12-11
        • 2019-05-01
        • 1970-01-01
        相关资源
        最近更新 更多