正则表达式查找非数字和/或字符串结尾
我想知道如何在Python 2.6的正则表达式中,包含一个字符串结束符和一个非数字字符,以便进行搜索。
我想找到以一个非数字开头,结尾是一个非数字或字符串结束符的10位数字。这是一个10位的ISBN号码,最后一位可以是'X'。
以下的写法不管用:
is10 = re.compile(r'\D(\d{9}[\d|X|x])[$|\D]')
is10 = re.compile(r'\D(\d{9}[\d|X|x])[\$|\D]')
is10 = re.compile(r'\D(\d{9}[\d|X|x])[\Z|\D]')
问题出在最后一组:[ \$|\D ],它是用来匹配一个非数字或字符串结束符的。
可以用以下内容进行测试:
line = "abcd0123456789"
m = is10.search(line)
print m.group(1)
line = "abcd0123456789efg"
m = is10.search(line)
print m.group(1)
2 个回答
0
\D(\d{10})(?:\Z|\D)
找到一个非数字字符后面跟着10个数字,后面再跟一个非数字字符或者字符串的结尾。这个规则只会捕捉到数字。虽然我看到你在找的是9个数字后面跟着一个数字或者X
或者x
,但我在你的要求中没有看到相同的内容。
8
你需要用括号来分组选择,而不是用方括号:
r'\D(\d{9}[\dXx])($|\D)'
|
和 []
是不同的东西。|
用来表示两个模式之间的选择,而 []
则是用来匹配里面的某个字符。所以,|
只能在 []
里面使用,前提是你想匹配字符 |
本身。要对模式的某些部分进行分组,就要用括号,这样可以限制 |
所表示的选择的范围。
如果你想避免创建匹配组,可以用 (?: )
来代替:
r'\D(\d{9}[\dXx])(?:$|\D)'