如果有一个文本(实际上是很多文本),其中某个地方是一个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:
这是否可以使用一个正则表达式?
谢谢!
答案 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>