Python正则表达式:拒绝一个两位数字并接受其他两位数字

时间:2011-04-26 11:39:30

标签: python regex

如何使正则表达式与超过2位数的特定数字不匹配。例如,任何数字,但13.下面的第二行代码不会工作,它将不匹配10,11,......或者第三行将查找一个不以1开头但有3的数字:

str = 'val=13'

regex = 'val=[^1][^3]'
regex = 'val=[^13]

re.search(regex, str)

6 个答案:

答案 0 :(得分:5)

使用前瞻断言:

In : re.findall('val=(?!13$)(\d{2,})', 'val=12') 
Out: ['12']

In : re.findall('val=(?!13$)(\d{2,})', 'val=13') 
Out: []

答案 1 :(得分:3)

为什么需要正则表达式?

>>> string = 'val=13'
>>> array=string.split("=")
>>> if array[0] == "val" and int(array[1]) < 100 and int(array[1]) == 13
...     print "match"
...
>>>

所有这些都假设我理解你所写的内容。

答案 2 :(得分:3)

  

有些人在面对问题时会思考   “我知道,我会使用正则表达式。”

     

现在他们有两个问题。

不要对这样的东西使用正则表达式:

str = "val=13"
num = int(str.split("=")[1])

# a two-digit number ranges from 10 - 99
if 10 <= num <= 99 and num != 13:
    print("Success!")

答案 3 :(得分:2)

如果你真的想要一个匹配除13以外的两位数字的正则表达式,那么这应该有效:

>>> str = 'val=13'
>>> regex = 'val=(?!13$)(\d{2,})'
>>> re.search(regex,str)
>>> str = 'val=26'
>>> re.search(regex,str)
<_sre.SRE_Match object at 0xb75c0bf0>

然而,正如其他人所指出的,这可能不是最佳方法。

答案 4 :(得分:0)

您可以使用'负面预测断言':

p = re.compile("val=(?!13)[0-9]{2}")
assert not p.match('val=13')
assert p.match('val=23')

答案 5 :(得分:0)

修改:更改为匹配具有一位或多位数的数字。

如果您需要采用各种形式的val=dd,其中dd必须是具有一个或多个数字的数字,并且该数字不能是13(或-13),并且等号周围可能有空格,这个数字可能有一个可选的前导+/-符号,然后这个脚本显示了一种方法:

import re
# Regex: VERBOSE, commented version.
reLong = r"""
    # Match "val=dd" where dd has two or more digits (but is not 13).
    \bval\s*=\s*  # "val=" literal with optional ws.
    (?!           # Begin negative lookahead assertion.
      [+\-]?      # Number may have optional sign.
      13          # This is the number we don't match
      \b          # which ends on a word boundary.
    )             # The number is not 13, +13 or -13.
    (             # $1: Two digit number.
      [+\-]?      # Allow optional sign.
      \d+         # One or more digits.
    )             # End $1: containing 2 digit number
    """
# Regex: short, uncommented version.
reShort = r"\bval\s*=\s*(?![+\-]?13\b)([+\-]?\d{2}\b)"

# Compile a regex object we can use over and over.
reObj = re.compile(reLong, re.IGNORECASE | re.VERBOSE)

# Test data strings. Positive and negative. With/without whitespace.
input = [
    # String with positive numbers. No whitespace.
    "val=1 val=13, val=133, val=12, otherval=1",
    # String with positive numbers. With whitespace.
    "val = 1 val = 13, val = 133, val = 12, otherval = 1",
    # String with negative numbers. No whitespace.
    "val=-1 val=-13, val=-133, val=-12, otherval=-1",
    # String with negative numbers. With whitespace.
    "val = -1 val = -13, val = -133, val = -12, otherval = -1",
    ]

# Parse all test data strings and print matches.
for str in input:
    matches = reObj.findall(str)
    if matches:
        print(matches)

正则表达式以简短和冗长的形式呈现,并带有注释。以下是脚本的输出:

['1', '133', '12']
['1', '133', '12']
['-1', '-133', '-12']
['-1', '-133', '-12']

其他 为了匹配不是超过一个字符长度的东西,我们使用否定先行。例如,如果想要匹配不是"BAD"的单词,这里是一个注释的正则表达式,它显示了如何:

reobj = re.compile(r"""
    # Match a word that is not: 'BAD'
    \b         # Anchor to start of word.
    (?!BAD\b)  # Verify that this word is not 'BAD'
    \w+        # Ok. Safe to match non-BAD word.
    \b         # Anchor to end of word.
    """, re.VERBOSE)