使用Python 2.7,想要使用正则表达式来查找给定字符串的Hello
部分。规则是,Hello
可能在模式中以{(1N)
,{(2N)
(直到10N
)或它们的组合{(1N,2N,3N,4N)
开头,并以{{结尾1}}。
除了匹配}
部分之外,我还想知道Hello
是否匹配,或1N
匹配或2N
匹配,还是10N
或{ {1}}匹配。
任何解决方案都表示赞赏。
1N
在第一个示例中,我想知道2N
, Some content {(1N,2N,3N,4N) Hello } Some content
Some content {(1N) Python } Some content
Some content {(2N) Regex } Some content
,1N
,2N
匹配,匹配的字符串为3N
;
在第二个例子中,我想知道4N
个匹配,匹配的字符串是Hello
;
在第三个示例中,我想知道1N
匹配,匹配字符串为Python
;
的问候, 林
答案 0 :(得分:2)
正则表达式无法真正计算(这就是为什么你说你试图写相同模式的10倍),而是你可以匹配序列然后拆分为count:
In [100]: match = re.compile(r"\{\s?\(\s?((\d+N,?)+)\)\s?(.*)\s?\}").search("Some content { (1N,2N,3N,4N) Hello } Some content")
In [101]: items, _, text = match.groups()
In [102]: splitted = items.split(',')
In [103]: print(splitted)
['1N', '2N', '3N', '4N']
In [104]: print(text)
Hello
注意:所有\s?
都可用于处理可选空白,如果您知道在某些地方不需要,请删除它们。
答案 1 :(得分:1)
In [1]: import re
In [2]: string = "{(1N,2N,3N,4N) Hello } Some Content {(5N) World }"
In [3]: re.findall(r"(\((?:(?:10|[1-9])N(?:,|\)))+)\s*(\w+)", string)
Out[3]: [('(1N,2N,3N,4N)', 'Hello'), ('(5N)', 'World')]
In [4]: result = re.findall(r"(\((?:(?:10|[1-9])N(?:,|\)))+)\s*(\w+)", string)
In [5]: nums = [re.findall(r"10N|[1-9]N", item[0]) for item in result]
In [6]: nums
Out[6]: [['1N', '2N', '3N', '4N'], ['5N']]
In [7]: matchString = [s[1] for s in result]
In [8]: matchString
Out[8]: ['Hello', 'World']
对于新字符串:
{{1}}