如何使用python输出带有正则表达式的大写字母

时间:2014-05-28 14:32:14

标签: python regex

我有一个如下字符串:

element = ['ABCa4.daf<<tag1>>permission : wiadsfth.accedsafsds.INTERNET<<tag2>>',]

我正在尝试正则表达式&#39; findall&#39;仅输出字符串末尾的大写字母(在tag2之前) 这是我做的:

re.findall('<<tag1>>' +"(.*?)"+ '<<tag2>>' , element)

但在INTERNET&#39;之前出现了其他字母,在INTERNET变更之前给出这些字母,我也不能标记它们。

任何人都能发光吗?非常感谢你!

2 个答案:

答案 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']