Skip to main content
 首页 » 编程设计

python之为什么正则表达式在 Python 2.7 中匹配一个额外的空格

2025年05月04日37tuyile006

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

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

我的问题是,在我下面的代码中,J 之间有一个额外的空格和 ,在2J ,3S , 和 J 之间的另一个额外空间和 ,在1J ,2S,3J .想知道空间从何而来以及如何解决?

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, content 用空格分隔两个打印值。如果您不想打印该空格,请连接两个字符串:

print num + content 

请注意,num 仅由 '(2J' 和 (1J' 组成,其余部分包含在 content 中 (',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 = 'Hello World';注意空格,您可能想在第二组的右括号后留空格:

judgeItemYesRegNew = r'(\((?:(?:10|[1-9])[JS](?:,|\)))+)\s*(.*?)\s?}' 

参见 https://regex101.com/r/xH5xP9/1该模式的在线正则表达式演示。

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')