Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python中的正则表达式查找ISBN_Python_Regex - Fatal编程技术网

用Python中的正则表达式查找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) 但我怎样才能找到这样

如果我有一篇文章(实际上是很多文章),里面的某个地方有一个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
  • 等等
使用一个正则表达式模式可以实现这一点吗


谢谢

在正则表达式的模式中添加
-
字符怎么样?这样,它将查找(数字或
-
)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}$'


强1
isbnRegex=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}'