thepoy 发表于 2021-10-1 09:46

Python 正则表达式分组的问题

本帖最后由 thepoy 于 2021-10-1 13:04 编辑

```python
s = '农业部、工信部、科技部关于xxx的通知'
re.findall(r'(?:(?=^|、)(.+?))+关于.+', s)
# ['、科技部']
```

我想提取出来“关于”前的所有部门,但写的正则表达式只能提取出挨着“关于”的那个部门。
正则表达式要在“关于”前面有“、”的字符串中提取信息。

知道问题所在了,python 捕获组只能匹配最后一个,+对捕获组没什么用,算是 python 的特色了。
split 的方法请不要再回答,我用的本就是 split 方法来绕过正则。
但我在此提问就是想知道如何用正则来完美解决这个问题。

okakaxio 发表于 2021-10-1 10:02



import re
s = '农业部、工信部、科技部关于xxx的通知'
str = re.findall(r'(.*?)关于', s)
words = str[0].split("、")
words

# ['农业部', '工信部', '科技部']

平淡最真 发表于 2021-10-1 10:03


([\u4e00-\u9fa5]*?)[、|关于]

yep96 发表于 2021-10-1 10:04

不会匹配多个的正则,但功能的话可以用下面的来实现
lis = re.findall(r'(.+)关于.+', s)
lis =

平淡最真 发表于 2021-10-1 10:05

未测试
只有一行文本,方法比较多

fanvalen 发表于 2021-10-1 10:44

为啥要那么复杂的规则
直接取一个关键字部
>>> re.findall("[\u4e00-\u9fa5]+部",s)
['农业部', '工信部', '科技部']
当然你要连在一起的
>>> re.findall("\S+部",s)
['农业部、工信部、科技部']

thepoy 发表于 2021-10-1 10:48

fanvalen 发表于 2021-10-1 10:44
为啥要那么复杂的规则
直接取一个关键字部
>>> re.findall("[%u4e00-%u9fa5]+部",s)


不是所有的部门都有“部”这个字,只能用顿号和“关于”作为提取关键字。

平淡最真 发表于 2021-10-1 13:39

thepoy 发表于 2021-10-1 10:48
不是所有的部门都有“部”这个字,只能用顿号和“关于”作为提取关键字。

3楼测试了不行吗?
那个不就用关于和顿号作为提取关键字吗?

埋身欲搏 发表于 2021-10-1 17:06

import re
s1 = '地震局、国务院、环保厅、工信部、应急管理局、科技处、白宫、国会、内阁关于xxx的通知'
res = re.findall('([\u4e00-\u9fa5]*)(、|关于)',s1)
for a in res:
    print(a)

页: [1]
查看完整版本: Python 正则表达式分组的问题