【问题标题】:Check if string matches pattern检查字符串是否匹配模式
【发布时间】:2012-09-17 16:26:08
【问题描述】:

如何检查字符串是否匹配此模式?

大写字母、数字、大写字母、数字...

例如,这些将匹配:

A1B2
B10L1
C1N200J1

这些不会('^' 表示问题)

a1B2
^
A10B
   ^
AB400
^

【问题讨论】:

  • 您能否解释一下为什么会出现问题?
  • ^([A-Z]\d+){1,}$ 喜欢这样吗?
  • 在第三个示例中,问题应该出在B 而不是A
  • 可能是问题的拼写错误。 AB 都是小写字母,对吗? A10baB400?
  • @Burhan,问题在于 A,因为 B 旁边有数字而 A 没有

标签: python regex string-matching


【解决方案1】:
import re
pattern = re.compile("^([A-Z][0-9]+)+$")
pattern.match(string)

【讨论】:

  • 来自re.match 上的文档:If zero or more characters at the beginning of string match the regular expression pattern。我只花了大约 30 分钟试图理解为什么我无法匹配字符串末尾的某些内容。似乎match 不可能,是吗?为此,re.search(pattern, my_string) 可以工作。
  • @conradk 是的,你是对的,我认为当你使用match 时,开头有一个隐含的^。我认为这比那个非常简单的解释要复杂一些,但我不清楚。你是对的,它确实从字符串的开头开始。
  • 我编辑了你的答案,因为在这种情况下只有search() 才有意义。
  • 是的,但这正是提问者想要的。我不确定您所说的“仅对search() 有意义”是什么意思。它与 match 完美匹配。
【解决方案2】:

单行:re.match(r"pattern", string) # No need to compile

import re
>>> if re.match(r"hello[0-9]+", 'hello1'):
...     print('Yes')
... 
Yes

如果需要,您可以将其评估为bool

>>> bool(re.match(r"hello[0-9]+", 'hello1'))
True

【讨论】:

  • 这很奇怪。为什么你可以在if 的上下文中使用re.match,但如果你在其他地方使用它就必须使用bool
  • 小心re.match。它只匹配字符串的开头。请查看re.search
  • @LondonRob 可能是因为if 检查匹配项不是None
  • 非常需要编译以确保正则表达式中没有错误,例如坏字符范围错误
  • @SuhFangmbeng 编译在多个地方使用相同的re 以提高效率时很有用。就错误而言,.match 会抛出与.compile 相同的错误。使用起来非常安全。
【解决方案3】:

请尝试以下方法:

import re

name = ["A1B1", "djdd", "B2C4", "C2H2", "jdoi","1A4V"]

# Match names.
for element in name:
     m = re.match("(^[A-Z]\d[A-Z]\d)", element)
     if m:
        print(m.groups())

【讨论】:

  • 这是唯一返回获取组所需的匹配的情况。我认为最好的答案。
【解决方案4】:
import re
import sys

prog = re.compile('([A-Z]\d+)+')

while True:
  line = sys.stdin.readline()
  if not line: break

  if prog.match(line):
    print 'matched'
  else:
    print 'not matched'

【讨论】:

    【解决方案5】:

    正则表达式让这一切变得简单......

    [A-Z] 将匹配 A 和 Z 之间的一个字符

    \d+ 将匹配一个或多个数字

    () 对事物进行分组(并且还返回事物......但现在只考虑它们的分组)

    + 选择 1 个或多个

    【讨论】:

      【解决方案6】:
      import re ab = re.compile("^([A-Z]{1}[0-9]{1})+$") ab.match(string)


      我相信这应该适用于大写数字模式。

      【讨论】:

        【解决方案7】:

        如 cmets 中所述,所有这些使用 re.match 的答案都隐式匹配字符串的开头。如果要泛化到整个字符串,则需要re.search

        import re
        
        pattern = re.compile("([A-Z][0-9]+)+")
        
        # finds match anywhere in string
        bool(re.search(pattern, 'aA1A1'))  # True
        
        # matches on start of string, even though pattern does not have ^ constraint
        bool(re.match(pattern, 'aA1A1'))  # False
        

        致谢:cmets 中的@LondonRob 和@conradkleinespel。

        【讨论】:

          猜你喜欢
          • 2010-12-19
          • 1970-01-01
          • 1970-01-01
          • 2018-04-03
          • 1970-01-01
          • 2016-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多