为什么正则表达式与Python 2.7中的额外空间匹配?

为什么正则表达式与Python 2.7中的额外空间匹配?,python,regex,python-2.7,Python,Regex,Python 2.7,使用Python2.7。在一个长字符串中,我想匹配以{}开头和结尾的内容。特别是,我对{}中的两个部分感兴趣。第一部分是[1J,2J,…,10J]或[1S,2S,…,10S]中的任何内容,用和分隔符包装,。我感兴趣的第二部分是{}中的剩余文本 在下面的示例中,我想在第一个{}中找到2J、3S和Hello World,在第二个{}中找到1J、2S、3J和Hello Python 我的问题是,在我下面的代码中,在2J,3S中,J和之间有一个额外的空格,在1J,2S,3J中,J和之间有另一个额外的空格

使用Python2.7。在一个长字符串中,我想匹配以{}开头和结尾的内容。特别是,我对{}中的两个部分感兴趣。第一部分是[1J,2J,…,10J]或[1S,2S,…,10S]中的任何内容,用和分隔符包装,。我感兴趣的第二部分是{}中的剩余文本

在下面的示例中,我想在第一个{}中找到2J、3S和Hello World,在第二个{}中找到1J、2S、3J和Hello Python

我的问题是,在我下面的代码中,在2J,3S中,J和之间有一个额外的空格,在1J,2S,3J中,J和之间有另一个额外的空格。想知道空间是从哪里来的以及如何修复它

import re

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])J|S(?:,|\)))+)(.*?)\s?}'
string = "Some content  {(2J,3S) Hello World } Some content {(1J,2S,3J) Hello Python }"
result = re.findall(judgeItemYesRegNew, string)
for (num, content) in result:
    print num, content
产出是,

(2J ,3S) Hello World
(1J ,2S,3J) Hello Python
print num,内容以空格分隔两个打印值。如果不希望打印该空间,请连接两个字符串:

print num + content
请注意,num仅分别由“2J”和“1J”组成。其余部分分别包含在内容“3S Hello World”和“2S、3J Hello Python”中

那是因为你用|把小组分成了J和s两部分;现在,同一括号内的前后所有内容都是这两个选项的一部分,而不仅仅是这两个字母。你要么匹配?:10 |[1-9]J,要么匹配S?:,|\

使用[JS]字符类而不是备选分组:

(\((?:(?:10|[1-9])[JS](?:,|\)))+)
充分表达:

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)(.*?)\s?}'
这将导致num='2J,3S'和content='helloworld';请注意空格,您可能希望在第二组结束后留下空格:

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)\s*(.*?)\s?}'
有关该模式的在线正则表达式演示,请参见

Python演示:

>>> import re
>>> judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)\s*(.*?)\s?}'
>>> string = "Some content  {(2J,3S) Hello World } Some content {(1J,2S,3J) Hello Python }"
>>> result = re.findall(judgeItemYesRegNew, string)
>>> for (num, content) in result:
...     print (num, content)
...
('(2J,3S)', 'Hello World')
('(1J,2S,3J)', 'Hello Python')
print num,内容以空格分隔两个打印值。如果不希望打印该空间,请连接两个字符串:

print num + content
请注意,num仅分别由“2J”和“1J”组成。其余部分分别包含在内容“3S Hello World”和“2S、3J Hello Python”中

那是因为你用|把小组分成了J和s两部分;现在,同一括号内的前后所有内容都是这两个选项的一部分,而不仅仅是这两个字母。你要么匹配?:10 |[1-9]J,要么匹配S?:,|\

使用[JS]字符类而不是备选分组:

(\((?:(?:10|[1-9])[JS](?:,|\)))+)
充分表达:

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)(.*?)\s?}'
这将导致num='2J,3S'和content='helloworld';请注意空格,您可能希望在第二组结束后留下空格:

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)\s*(.*?)\s?}'
有关该模式的在线正则表达式演示,请参见

Python演示:

>>> import re
>>> judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)\s*(.*?)\s?}'
>>> string = "Some content  {(2J,3S) Hello World } Some content {(1J,2S,3J) Hello Python }"
>>> result = re.findall(judgeItemYesRegNew, string)
>>> for (num, content) in result:
...     print (num, content)
...
('(2J,3S)', 'Hello World')
('(1J,2S,3J)', 'Hello Python')
您将+放在组1之后,但忘记确保逗号也匹配。将其添加为要匹配的可选符号。此外,?:,| \部分放在备用分支内,而应将作为组1中的尾随字符放在外部,而逗号则应作为可选子模式进行备用

(\((?:,?(?:10|[1-9])[JS])+\))\s*(.*?)\s*}
      ^^

我还修改了模式以匹配:

\?:,?:10|[1-9][JS]+\-第1组:

\-文字 ?:,?:10 |[1-9][JS]+-1个或多个序列: ,? - 可选逗号 ?:10 |[1-9][JS]-10或后跟J或S的一个数字 \-文字 \s*-零个或多个空格

.*? - 第2组:除换行符以外的零个或多个字符到第一个字符 \s*-0+whiotespaces }-文字}。 以及:

您将+放在组1之后,但忘记确保逗号也匹配。将其添加为要匹配的可选符号。此外,?:,| \部分放在备用分支内,而应将作为组1中的尾随字符放在外部,而逗号则应作为可选子模式进行备用

(\((?:,?(?:10|[1-9])[JS])+\))\s*(.*?)\s*}
      ^^

我还修改了模式以匹配:

\?:,?:10|[1-9][JS]+\-第1组:

\-文字 ?:,?:10 |[1-9][JS]+-1个或多个序列: ,? - 可选逗号 ?:10 |[1-9][JS]-10或后跟J或S的一个数字 \-文字 \s*-零个或多个空格

.*? - 第2组:除换行符以外的零个或多个字符到第一个字符 \s*-0+whiotespaces }-文字}。 以及:


在第一种情况下,您有2J和3S Hello World捕获。我想你需要修正正则表达式。试试\[^]+\\s*?\s?}@WiktorStribiżew,我想你会明白我在代码中的错误所在。但是我的正则表达式有什么问题?我已经在那里添加了一个+号,以匹配多个作为第一个捕获组。问题是,第一个组的第一部分仅与之前的第一个值匹配,在您的输入和。*?与其他匹配。在第一种情况下,您有2J和3S Hello World捕获。我想你需要修正正则表达式。试试\[^]+\\s*?\s?}@WiktorStribiżew,我想你会明白我在代码中的错误所在。但是我的正则表达式有什么问题?我已经在那里添加了一个+号,以匹配多个作为第一个捕获组。问题是,第一个组的第一部分仅与之前的第一个值匹配,在您的输入和。*?和其他的相配,谢谢
Martijn,你的代码对我有用。我的问题是,我认为num匹配2J,3S,但似乎我错了,num只匹配2J?想知道如何修复它吗?想知道我的正则表达式有什么问题吗?我已经在那里添加了一个+符号以匹配多个作为第一个捕获组。谢谢Martijn,将您的答复标记为答案。聪明的接球!谢谢Martijn,我试过你的代码。我的问题是,我认为num匹配2J,3S,但似乎我错了,num只匹配2J?想知道如何修复它吗?想知道我的正则表达式有什么问题吗?我已经在那里添加了一个+符号以匹配多个作为第一个捕获组。谢谢Martijn,将您的答复标记为答案。聪明的接球!接球不错,维克托!他们没有忘记逗号。[JS]更为重要,因为J|S将组分成了带逗号和不带逗号的部分。事实上,是的,可选模式是修复的一部分。很好的Wiktor!他们没有忘记逗号。[JS]更为重要,因为J|S将组分成了带逗号和不带逗号的部分。实际上,是的,可选模式是修复的一部分。