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