我有一个如下字符串:
element = ['ABCa4.daf<<tag1>>permission : wiadsfth.accedsafsds.INTERNET<<tag2>>',]
我正在尝试正则表达式&#39; findall&#39;仅输出字符串末尾的大写字母(在tag2之前) 这是我做的:
re.findall('<<tag1>>' +"(.*?)"+ '<<tag2>>' , element)
但在INTERNET&#39;之前出现了其他字母,在INTERNET变更之前给出这些字母,我也不能标记它们。
任何人都能发光吗?非常感谢你!答案 0 :(得分:4)
您需要在[A-Z]+
之前允许任何符号:
>>> import re
>>> s = 'ABCa4.daf<<tag1>>permission : wiadsfth.accedsafsds.INTERNET<<tag2>>'
>>> re.findall('<<tag1>>.*?([A-Z]+)<<tag2>>', s)
['INTERNET']
.*?
是任何角色的非贪婪匹配。 [A-Z]+
匹配一个或多个大写字母。
答案 1 :(得分:1)
只需匹配“任何大写的序列,然后是<<tag2>>
。
re.findall(r'[A-Z]+(?=<<tag2>>)', element[0])
或
re.findall(r'[A-Z]+(?=[^<>]*<<tag2>>)', element[0])
处理INTERNET foobar <<tag2>>
之类的内容。
最后,要在开始和结束标记之间的任何位置匹配A-Z
的任何序列,您将需要这个小怪物:
rr = r"""(?x)
[A-Z]+
(?=
(?:
(?! <<tag1>>) .
) *
<<tag2>>
)
"""
element = ['ABC xyz DEF <<tag1>> permission : INTERNET foo XYZ bar <<tag2>>',]
print re.findall(rr, element[0]) # ['INTERNET', 'XYZ']