使用正则表达式检查测试字符串是否是固定格式

时间:2012-07-08 17:16:19

标签: python regex

我想确保使用正则表达式,字符串格式为“999.999-A9-Won”,并且没有任何空格或制表符或换行符。

  1. 0 - 9范围内可能有2个或3个数字。
  2. 接下来是'。'
  3. 再次跟随0或9
  4. 范围内的2或3个数字
  5. 后面跟一个连字符,字符'A'和0到9之间的数字。
  6. 这可以是任何内容。
  7. 示例:87.98-A8-abcdef

    我到现在为止的代码是:

    testString = "87.98-A1-help"
    regCompiled = re.compile('^[0-9][0-9][.][0-9][0-9][-A][0-9][-]*');
    checkMatch = re.match(regCompiled, testString);
    if checkMatch:
        print ("FOUND")
    else:
        print("Not Found")
    

    这似乎不起作用。我不确定我缺少什么,这里的问题是我不检查空格,制表符和换行符,也硬编码十进制前后整数的数字。

2 个答案:

答案 0 :(得分:4)

使用{m,n},您可以指定模式可以重复的次数,\d字符类匹配所有数字。 \S字符类匹配空格的任何内容。使用这些正则表达式可以简化为:

re.compile(r'\d{2,3}\.\d{2,3}-A\d-\S*\Z')

还注意\Z锚点,使\S*表达式一直匹配到字符串的末尾。这里不允许有空格(换行符,制表符等)。如果将它与.match() method结合使用,可以确保测试字符串中的所有字符都符合该模式,仅此而已。有关.match()

的详细信息,请参阅search() vs. match()

小型演示:

>>> import re
>>> pattern = re.compile(r'\d{2,3}\.\d{2,3}-A\d-\S*\Z')
>>> pattern.match('87.98-A1-help')
<_sre.SRE_Match object at 0x1026905e0>
>>> pattern.match('123.45-A6-no whitespace allowed')
>>> pattern.match('123.45-A6-everything_else_is_allowed')
<_sre.SRE_Match object at 0x1026905e0>

答案 1 :(得分:2)

让我们来看看你的正则表达式。如果你想:

  

“0到9”范围内的2或3个数字

然后你不能用'^[0-9][0-9][.]开始你的正则表达式,因为它只会在开头只匹配两个整数的字符串。你的正则表达式的第二个问题在最后:[0-9][-]* - 如果你想匹配字符串末尾的任何内容,那么你需要用.*来完成正则表达式。 编辑:请参阅Martijn Pieters关于正则表达式中空白的答案。

这是一个更新的正则表达式:

testString = "87.98-A1-help"
regCompiled = re.compile('^[0-9]{2,3}\.[0-9]{2,3}-A[0-9]-.*');
checkMatch = re.match(regCompiled, testString);
if checkMatch:
    print ("FOUND")
else:
    print("Not Found")

并非所有内容都需要包含在[]中,特别是当您知道要匹配的字符(例如-A部分)时。此外:

  • 符号{m,n}表示:至少匹配m次,最多n次,
  • 要明确匹配一个点,你需要转义它:这就是上面正则表达式中有\.的原因。