正则表达式:从文本中提取一些信息

时间:2018-10-18 09:33:46

标签: python regex

我有一个数据框,它是其中的一部分

Судебный участок № 24 в Павлоградском судебном районе Омской области
Судебный участок № 4 в Горьковского судебного района Омской области
Судебный участок № 5 в Знаменском судебном районе Омской области
Судебный участок № 19 в Оконешниковском судебном районе Омской области
Судебный участок № 9 в Кормиловском районе Омской области
Судебный участок № 29 в Таврическом судебном районе Омской области
Судебный участок № 30 в Таврическом районе Омской области
Судебный участок № 44 Кировского судебного района в городе Омске

期望输出

Павлоградском судебном районе
Горьковского судебного района
Знаменском судебном районе
Оконешниковском судебном районе
Кормиловском районе
Таврическом судебном районе
Таврическом районе
Кировского судебного района

我尝试使用正则表达式

[А-Я][А-Яа-я-]+\s+[а-я\s]*\s*(?:округа|район(?!а|е|у|ого))

但是它只返回Тверской район。其他人是空的。 之后,我更改了此表达式并尝试使用

[А-Я][А-Яа-я-]+\s+[а-я\s]*\s*(?:округа|район((?!а|е|у|ого).)*)

例如,它返回数据,但不返回单词的结尾

Горьковского судебного район

代替

Горьковского судебного района

我认为使用?!可以使用不需要的单词。 (对我而言,不需要的单词结尾)。

我应该如何将此表达式更改为获取欲望输出?

1 个答案:

答案 0 :(得分:2)

使用负前瞻,您将使所有район后跟аеуого的匹配都失败。

使用非捕获组。将(?!а|е|у|ого)替换为(?:а|е|у|ого)或仅替换[а-яё]*,以将单词район的末尾匹配。

整个正则表达式看起来像

r'[А-ЯЁ][А-ЯЁа-яё-]+\s+[а-яё\s]*\s*(?:округа|район[а-яё]*)'

或者,如果您只想将字符串作为整个单词匹配,则使用单词边界:

r'\b[А-ЯЁ][А-ЯЁа-яё-]+\s+[а-яё\s]*\s*(?:округа|район[а-яё]*)\b'

请参见regex demo

如果要将正则表达式与str.extract一起使用,则需要使用捕获括号来包装模式:

df['col'].str.extract(r'\b([А-ЯЁ][А-ЯЁа-яё-]+\s+[а-яё\s]*\s*(?:округа|район[а-яё]*))\b')