在Python中解析第4行大写字母?

drb*_*sen 4 python

如何解析大写字母第4次出现的文本行?例如给出以下行:

adsgasdlkgasYasdgjaUUalsdkjgaZsdalkjgalsdkjTlaksdjfgasdkgj
oiwuewHsajlkjfasNasldjgalskjgasdIasdllksjdgaPlsdakjfsldgjQ
Run Code Online (Sandbox Code Playgroud)

我想抓住:

`ZsdalkjgalsdkjTlaksdjfgasdkgj`
`PlsdakjfsldgjQ`
Run Code Online (Sandbox Code Playgroud)

我确信可能有比正则表达更好的方法,但我试图做一个非贪婪的比赛; 这样的事情:

match = re.search(r'[A-Z].*?$', line).group()
Run Code Online (Sandbox Code Playgroud)

NPE*_*NPE 9

我提出两种方法.

方法1:全力以赴的正则表达式

In [1]: import re

In [2]: s = 'adsgasdlkgasYasdgjaUUalsdkjgaZsdalkjgalsdkjTlaksdjfgasdkgj'

In [3]: re.match(r'(?:.*?[A-Z]){3}.*?([A-Z].*)', s).group(1)
Out[3]: 'ZsdalkjgalsdkjTlaksdjfgasdkgj'
Run Code Online (Sandbox Code Playgroud)

.*?[A-Z]消耗字符直到并且包括,第一个大写字母.

(?:... ){3}重复上述三次不会造成任何捕捉组.

以下内容.*? 匹配第四个大写字母之前的剩余字符.

最后,([A-Z].*)捕获第四个大写字母以及随后进入捕获组的所有内容.

方法2:更简单的正则表达式

In [1]: import re

In [2]: s = 'adsgasdlkgasYasdgjaUUalsdkjgaZsdalkjgalsdkjTlaksdjfgasdkgj'

In [3]: ''.join(re.findall(r'[A-Z][^A-Z]*', s)[3:])
Out[3]: 'ZsdalkjgalsdkjTlaksdjfgasdkgj'
Run Code Online (Sandbox Code Playgroud)

这会直接攻击问题,我认为更容易阅读.