2

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

  1. 0 - 9 范围内可能有 2 或 3 个数字。
  2. 后跟一个句号'.'
  3. 后跟 0 - 9 范围内的 2 或 3 个数字
  4. 后跟连字符、字符 'A' 和 0 - 9 之间的数字。
  5. 这可以跟随任何东西。

示例: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")

这似乎不起作用。我不确定我错过了什么,这里的问题是我没有检查空格、制表符和换行符,并且还硬编码了小数点前后的整数数字。

4

2 回答 2

5

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

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

还要注意\Z锚点,使\S*表达式一直匹配到字符串的末尾。此处不允许使用空格(换行符、制表符等)。如果将此.match()方法与确保测试字符串中的所有字符都符合模式的方法相结合,仅此而已。有关的更多信息,请参见search()vsmatch().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>
于 2012-07-08T17:22:09.577 回答
3

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

“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")

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

  • 表示法的{m,n}意思是:至少匹配m和最多匹配n,并且
  • 要显式匹配一个点,您需要对其进行转义:这就是\.上面的正则表达式中存在的原因。
于 2012-07-08T17:19:13.803 回答