正则表达式中的嵌套文本

2024-10-02 22:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习正则表达式。我很难把我的脑袋缠在类似的文字上,这些文字嵌套在更大的文字里。也许你能帮我理清思路。你知道吗

下面是一个示例测试字符串:

message msgName { stuff { innerStuff } } \n message mn2 { junk }

我想拉出term(例如,msgNamemn2)以及下一条消息之前的内容,得到如下列表:

msgName 
{ stuff { innerStuff } more stuff } 
mn2 
{ junk }'

我有麻烦太贪婪或不贪婪匹配保留内括号,但分开更高层次的消息。你知道吗

这里有一个程序:

import re
text = 'message msgName { stuff { innerStuff } more stuff } \n message mn2 { junk }'
messagePattern = re.compile('message (.*?) {(.*)}', re.DOTALL)
messageList = messagePattern.findall(text)
print "messages:\n"
count = 0
for message, msgDef in messageList:
    count = count + 1
    print str(count)
    print message
    print msgDef

它产生:

messages:

1
msgName
 stuff { innerStuff } more stuff } 
 message mn2 { junk 

下面是我的下一个尝试,它使内部部分不贪婪:

import re
text = 'message msgName { stuff { innerStuff } more stuff } \n message mn2 { junk }'
messagePattern = re.compile('message (.*?) {(.*?)}', re.DOTALL)
messageList = messagePattern.findall(text)
print "messages:\n"
count = 0
for message, msgDef in messageList:
    count = count + 1
    print str(count)
    print message
    print msgDef

它产生:

messages:

1
msgName
 stuff { innerStuff 
2
mn2
 junk 

所以,我失去了} more stuff }

在这件事上我真的遇到了心理障碍。有人能给我指出正确的方向吗?我无法处理嵌套括号中的文本。一个关于工作正则表达式的建议或者一个处理嵌套的类似文本的简单示例都会很有帮助。你知道吗


Tags: textremessagemorecountmessagesprintstuff
1条回答
网友
1楼 · 发布于 2024-10-02 22:32:31

如果可以使用PyPi ^{} module,则可以利用其子例程调用支持:

>>> import regex
>>> reg = regex.compile(r"(\w+)\s*({(?>[^{}]++|(?2))*})")
>>> s = "message msgName { stuff { innerStuff } } \n message mn2 { junk }"
>>> print(reg.findall(s))
[('msgName', '{ stuff { innerStuff } }'), ('mn2', '{ junk }')]

正则表达式^{}匹配:

  • (\w+)-1组匹配1个或多个字母数字/下划线字符
  • \s*-0+空格
  • ({(?>[^{}]++|(?2))*})-第2组匹配一个{,然后是非{}或另一个由于(?2)子例程调用而平衡的{...}(递归整个第2组子模式),0次或更多次,然后匹配一个结束的}。你知道吗

如果只有一个嵌套级别,re也可以与

(\w+)\s*{[^{}]*(?:{[^{}]*}[^{}]*)*}

看这个regex demo

  • (\w+)-第1组匹配单词字符
  • \s*-0+空格
  • {-大括号
  • [^{}]*-0+除{}以外的字符
  • (?:{[^{}]*}[^{}]*)*-0+序列:
    • {-大括号
    • [^{}]*-0+除{}以外的字符
    • }-右大括号
    • [^{}]*-0+除{}以外的字符
  • }-右大括号

相关问题 更多 >