在Python中使用正则表达式查找ISBN

时间:2013-08-14 08:45:27

标签: python regex

如果有一个文本(实际上是很多文本),其中某个地方是一个ISBN,我必须找到它。

我知道:我的ISBN-13将以“978”开头,后跟10位数。

我不知道:有多少' - '(减号),如果它们在正确的位置。

我的代码只会在没有任何减号的情况下找到我的ISBN:

regex=r'978[0-9]{10}'
pattern = re.compile(regex, re.UNICODE)
for match in pattern.findall(mytext):
    print(match)

但我怎样才能找到这样的ISBN:

  • 978-123-456-789-0
  • 978-1234-567890
  • 9781234567890
  • 等...

这是否可以使用一个正则表达式?

谢谢!

6 个答案:

答案 0 :(得分:2)

这匹配10个数字,并在每个数字之前允许一个可选的连字符:

regex = r'978(?:-?\d){10}'

答案 1 :(得分:2)

由于您不能连续使用2个连字符,并且必须以数字结尾:

r'978(-?\d){10}'

...在978之后允许连字符,在每个连字符之后强制执行一个数字(不以连字符结尾),并通过使每个连字符可选来允许连续数字。

我会在\b之前和978之后添加{10},以确保ISBN与周围文本完全分开。

另外,我会在左括号后添加?:,以使那些非捕获(性能稍好,也更具表现力),使其成为:

r'\b978(?:-?\d){10}\b'

答案 2 :(得分:1)

如何在正则表达式的模式中添加-字符?这样,它将寻找(数字或-)x10次的任意组合。

regex=r'978[0-9\-]{10}'

虽然使用

可能更好
regex=r'978[0-9\-]+'

因为否则如果我们使用{10}并找到一些-,则不会找到所有数字。

测试

>>> import re
>>> regex=r'978[0-9\-]+'
>>> pattern = re.compile(regex, re.UNICODE)
>>> mytext="978-123-456-789-0"
>>> for match in pattern.findall(mytext):
...     print(match)
... 
978-123-456-789-0
>>> mytext="978-1234-567890"
>>> for match in pattern.findall(mytext):
...     print(match)
... 
978-1234-567890
>>> mytext="9781234567890"
>>> for match in pattern.findall(mytext):
...     print(match)
... 
9781234567890
>>> 

答案 3 :(得分:1)

您可以尝试匹配每个数字和-个字符。在这种情况下,您无法知道有多少字符可以找到:

regex=r'978[\d\-]+\d'
pattern = re.compile(regex, re.UNICODE)
for match in pattern.findall(mytext):
    print(match)

如果您的ISBN卡在其他数字或连字符之间,您会遇到一些问题,但如果它明显分开,请不要担心:)

编辑:根据第一条评论,您可以在正则表达式的末尾添加一个额外的\ d(我刚刚在下面更新了我的代码)因为您知道ISBN以数字。

答案 4 :(得分:0)

最简单的方法应该是

regex=r'978[-0-9]{10,15}'

将接受他们。

答案 5 :(得分:0)

如果有人还在看:ISBN Detail and Contraints

简单的regex = r'^(978-?|979-?)?\d(-?\d){9}$'

一个强isbnRegex = r'^(978-?|979-?)?\d{1,5}-?\d{1,7}-?\d{1,6}-?\d{1,3}$',并在除去hypen之后包括长度检查10和13(注意:还为长度= 13添加子字符串检查,即仅用于978或979,仍然需要检查一些边缘情况)< / p>