Skip to main content
 首页 » 编程设计

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

2024年09月07日30birdshome

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

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

欲望输出

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

我尝试使用正则表达式

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

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

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

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

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

代替

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

我认为使用 ?! 可以使用不需要的词。 (对我来说结束不需要的话)。

我应该如何改变这个表达式来获得期望的输出?

请您参考如下方法:

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

改用非捕获组。将 (?!а|е|у|ого) 替换为 (?:а|е|у|ого) 或只是 [а-яё]* 匹配单词 район 到它的结尾。

整个正则表达式看起来像

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

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

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

参见 regex demo .

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

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