我正在努力学习正则表达式。我很难把我的脑袋缠在类似的文字上,这些文字嵌套在更大的文字里。也许你能帮我理清思路。你知道吗
下面是一个示例测试字符串:
message msgName { stuff { innerStuff } } \n message mn2 { junk }
我想拉出term(例如,msgName
,mn2
)以及下一条消息之前的内容,得到如下列表:
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 }
在这件事上我真的遇到了心理障碍。有人能给我指出正确的方向吗?我无法处理嵌套括号中的文本。一个关于工作正则表达式的建议或者一个处理嵌套的类似文本的简单示例都会很有帮助。你知道吗
如果可以使用PyPi ^{} module ,则可以利用其子例程调用支持:
正则表达式^{} 匹配:
(\w+)
-1组匹配1个或多个字母数字/下划线字符\s*
-0+空格({(?>[^{}]++|(?2))*})
-第2组匹配一个{
,然后是非{}
或另一个由于(?2)
子例程调用而平衡的{...}
(递归整个第2组子模式),0次或更多次,然后匹配一个结束的}
。你知道吗如果只有一个嵌套级别,
re
也可以与看这个regex demo
(\w+)
-第1组匹配单词字符\s*
-0+空格{
-大括号[^{}]*
-0+除{
和}
以外的字符(?:{[^{}]*}[^{}]*)*
-0+序列:{
-大括号[^{}]*
-0+除{
和}
以外的字符}
-右大括号[^{}]*
-0+除{
和}
以外的字符}
-右大括号相关问题 更多 >
编程相关推荐