使用 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')
关于python - 为什么正则表达式在 Python 2.7 中匹配一个额外的空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38969486/