正则表达式查找非数字和/或字符串结尾

6 投票
2 回答
8894 浏览
提问于 2025-04-15 14:41

我想知道如何在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)'

撰写回答