用Python中的正则表达式查找ISBN
如果我有一篇文章(实际上是很多文章),里面的某个地方有一个ISBN,我必须找到它 我知道:我的ISBN-13将以“978”开头,后跟10位数字 我不知道:有多少个“-”(负号)以及它们是否在正确的位置 我的代码只能找到ISBN,没有任何负号:用Python中的正则表达式查找ISBN,python,regex,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) 但我怎样才能找到这样
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
- 等等
谢谢 在正则表达式的模式中添加
-
字符怎么样?这样,它将查找(数字或-
)x10次的任意组合
regex=r'978[0-9\-]{10}'
虽然使用它可能更好
regex=r'978[0-9\-]+'
因为否则,如果我们使用{10}
并找到一些-
,就不会找到所有的数字
试验
您可以尝试匹配每个数字和
-
字符。在这种情况下,您无法知道找到了多少个字符:
regex=r'978[\d\-]+\d'
pattern = re.compile(regex, re.UNICODE)
for match in pattern.findall(mytext):
print(match)
如果您的ISBN卡在其他数字或连字符之间,您会遇到一些问题,但如果ISBN清楚地分开,则无需担心:)
编辑:根据第一条注释,您可以在正则表达式的末尾添加一个额外的\d(我已经更新了下面的代码),因为您知道ISBN以数字结尾 最简单的方法应该是
regex=r'978[-0-9]{10,15}'
将接受它们。这与10位数字匹配,并允许在每个数字前有一个可选的连字符:
regex = r'978(?:-?\d){10}'
由于不能有两个连续连字符,且必须以数字结尾:
r'978(-?\d){10}'
。。。允许在紧接着的978
后面加一个连字符,强制在每个连字符后面加一个数字(不以连字符结尾),并允许通过使每个连字符可选来连续数字
我会在978
之前添加\b
,然后在{10}
之后添加,以确保ISBN与周围的文本很好地分开
另外,我会在左括号后面添加?:
,以使那些非捕获(性能稍好一些,也更具表现力)变得:
r'\b978(?:-?\d){10}\b'
如果仍有人在查看:
简单的一个regex=r'^(978-?| 979-?)?\d(-?\d){9}$'
强1isbnRegex=r'^(978-?| 979-?)?\d{1,5}-?\d{1,7}-?\d{1,6}-?\d{1,3}$”
并在删除hypen后包括长度检查10和13(注意:还添加长度为13的子字符串检查,即仅对于978或979,仍需要检查某些边情况)但它必须以数字结尾,因此添加最后的\d
,他清楚地指出总共13位数字,所以添加一个量词,至少是一个范围。你不知道连字符的数量(或者你选择一个最大值,比如最多6个连字符,然后放入一个{10,16}
)。这就是我写“范围”时的意思。实际上,你最近的编辑:(1)允许以连字符结尾(2)允许16位你的模式和演示不匹配。您建议的模式不允许演示匹配。Ops,solved@MartijnPieters。它与OP给出的示例相匹配。它只与示例部分匹配。@JanneKarila哦,现在我明白了:应该有10位数字+未确定数量的-
。我的仅与前10个字符匹配:(ISBN如何与文本的其余部分分开?
regex = r'978(?:-?\d){10}'