2017-04-19 235 views
1

我想正则表达式写到具有以下格式正则表达式匹配括号中的字符串

12740(34,12)的字符串[ABC(A1B2C3)(a2b3c4)......] myId123

目前,我有这样的事情

\((?P<expression>\S+)\) 

但有了这个,我可以只收集方括号中的字符串。

是否有无论如何我可以捕捉方括号前的整数,还有方括号内的字符串。

小括号内的字符串数量将不会相同。我也可以有一个字符串,它看起来像这样

10(3,2),[ABC(A1B2C3)] myId1

我知道我可以写使用蛮力上述表达一个简单的正则表达式。但任何人都可以请帮我写一个方括号内的字符串数量不断变化。

((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$) 

Regex101:提前

+1

你不能使用're'的单个正则表达式来捕获任意数量的组。您在比赛中只有与该模式中定义的数量相同的组。 –

+0

@WiktorStribiżewohk,删除.. !! –

+0

@WiktorStribiżew这是一个愚蠢的问题(无论OP是否意识到)每个“用正则表达式解析HTML/XML”的问题。我们没有一个规范的“正则表达式/ CFG”问题来关闭它们吗?也许我们应该。 –

回答

2

感谢您可以通过使用^$,这意味着开始,分别结束捕捉信息

https://regex101.com/r/PoA5k4/1

要使结果更有用,我会把它变成字典:

import re 

myStr = "12740(34,12) [abc (a1b2c3) (a2b3c4)......] myId123" 
di = {} 
for find in re.findall("((?P<front>^\d+)|\((?P<expression>\S+)\)|(?P<id>[a-zA-Z0-9]+)$)",myStr): 
    if find[1] != "": 
     di["starter"] = find[1] 
    elif find[3] != "": 
     di["id"] = find[3] 
    else: 
     di.setdefault("expression",[]).append(find[2]) 
print(di) 
+0

中工作。 。非常感谢您的回答。 – sjaymj62