如何使用正则表达式提取第二个大写字母后的所有文本(数字、字母、符号)?

How do I extract with regex all the text (numbers, letters, symbols) after the second capital letter?

They won.             Elles gagnèrent.
They won.    Ils ont gagné.
They won.        Elles ont gagné.
Tom came.    Tom est venu.
Tom died.       Tom est mort.
Tom knew. Tom savait.
Tom left.    Tom est parti.
Tom left.       Tom partit.
Tom lied. Tom a menti.
Tom lies.    Tom ment.
Tom lost.            Tom a perdu.
Tom paid.    Tom a payé.

我在组合一个提取第二个大写字母(包括它)后的所有文本的正则表达式模式时遇到了一些问题。

例如:

They won.             Elles gagnèrent.

在这种情况下,您应该提取:

Elles gagnèrent.

这是我的代码,但效果不佳:

import re

line = "They won.             Elles gagnèrent." #for example this case

match = re.search(r"\s¿?(?:A|Á|B|C|D|E|É|F|G|H|I|Í|J|K|LL|L|M|N|Ñ|O|Ó|P|Q|R|S|T|U|Ú|V|W|X|Y|Z)\s((?:\w\s)+)?" , line)

n_sense = match.group()

print(repr(n_sense)) #should print "Elles gagnèrent."

您可以按照您的描述搜索匹配项:

[A-Z].*?([A-Z].*)

这是一个大写字母,后跟零个或多个任何内容,然后是另一个大写字母,然后是任何内容,捕获最后一组:

import unicodedata
import re

s = '''They won.             Elles gagnèrent.
They won.    Ils ont gagné.
They won.        Elles ont gagné.
Tom came.    Tom est venu.
Tom died.       Tom est mort.
Tom knew. Tom savait.
Tom left.    Tom est parti.
Tom left.       Tom partit.
Tom lied. Tom a menti.
Tom lies.    Tom ment.
Âom lost.            Étienne a perdu.  # << note accents
Tom paid.    Tom a payé.'''


s = unicodedata.normalize('NFD', s)
re.findall(r'[A-Z].*?([A-Z].*)', s, re.UNICODE)

哪个会给你:

['Elles gagnèrent.',
 'Ils ont gagné.',
 'Elles ont gagné.',
 'Tom est venu.',
 'Tom est mort.',
 'Tom savait.',
 'Tom est parti.',
 'Tom partit.',
 'Tom a menti.',
 'Tom ment.',
 'Étienne a perdu.',
 'Tom a payé.']

如果所有这些空格都是实际文本的一部分,则可能更容易匹配或拆分这些空格。 re.UNICODE 标志将允许它匹配带有重音符号的大写字母,例如 Étienne,但您需要确保先对 unicode 进行规范化。

这是正则表达式:[^A-Z]*[A-Z][^A-Z]*[A-Z]([^\n]+)

括号把你要的文字包起来,这叫分组。您将在 python 中轻松了解它及其工作原理。

不过最好是提供一个工具https://regex101.com/

您可以尝试以下代码。

with open(file, "r") as r:
    for line in r:
        line = re.sub('^[^A-Z]*[A-Z][^A-Z]*','', line)
        print(line, end="")