如何使正则表达式与超过2位数的特定数字不匹配。例如,任何数字,但13.下面的第二行代码不会工作,它将不匹配10,11,......或者第三行将查找一个不以1开头但有3的数字:
str = 'val=13'
regex = 'val=[^1][^3]'
regex = 'val=[^13]
re.search(regex, str)
答案 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)