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

时间:2009-09-29 17:18:10

标签: python regex

如何在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 :(得分:4)

您必须使用括号分组备选项,而不是括号:

r'\D(\d{9}[\dXx])($|\D)'

|[]不同。它标记了两种模式之间的替代方案,而[]匹配其中一个包含的字符。因此,|只应在[]内使用,如果您想匹配实际字符|。使用括号对模式的某些部分进行分组,因此这些应用于限制由|标记的替代范围。

如果您想避免这会创建匹配组,则可以改为使用(?: )

r'\D(\d{9}[\dXx])(?:$|\D)'

答案 1 :(得分:0)

\D(\d{10})(?:\Z|\D)

找到非数字后跟10位数字,以及单个非数字或字符串结尾。仅捕获数字。虽然我发现您正在搜索九位数后跟数字或Xx,但我在您的要求中看不到同样的内容。