想了一中午,也没想出来这个改怎么写,一个头四个大;各个搜索引擎都查过了,最后只能到 v2 上来求助。
源字符串是题目的选项:
A. A 类 - 3.2 B. B 类 - 6.4 C. C 类 - 12.8 D. D 类 - 25.6
想要将选项和选项的内容分开并获取到,即获取到以下四个分组:
[('A', 'A 类 - 3.2'), ('B', 'B 类 - 6.4'), ('C', 'C 类 - 12.8'), ('D', 'D 类 - 25.6')]
上网查有说到用环视,可是我在贪婪匹配下总是得不到想要的结果,以下是我现在能想到的最接近的正则:
>>> text = "A. A 类 - 3.2 B. B 类 - 6.4 C. C 类 - 12.8 D. D 类 - 25.6" >>> pattern = re.compile(r"(?P<option>\w+)[、\.](?P<content>(?!.*?[A-Z]\.).*)") >>> pattern.findall(text) [('D', ' D 类 - 25.6')] >>> pattern = re.compile(r"(?P<option>\w+)[、\.](?P<content>.*(?!.*?[A-Z]\.))") >>> pattern.findall(text) [('A', ' A 类 - 3.2 B. B 类 - 6.4 C. C 类 - 12.8 D. D 类 - 25.6')] >>>
谢谢大家!
![]() | 1 nazor 2018-08-05 14:52:50 +08:00 via iPhone 选项内容有格式限制吗?没有格式限制,有歧义啊。 |
![]() | 2 IvanLi127 2018-08-05 14:57:11 +08:00 via Android 目前例子这个还是能用正则搞的 用 A. 这样的东西区分选项。还有不要用贪婪模式 |
![]() | 4 pandacat 2018-08-05 15:02:45 +08:00 (([ABCD])\. +(\2\W+\d+\.?\d+)) 这样? |
![]() | 5 guiqiqi OP @IvanLi127 我后面的那个环视 `(?!.*?[A-Z]\.)` 是想用 A.这样的区分,还是不知道怎么搞,求赐教! |
![]() | 7 guiqiqi OP |
![]() | 8 imn1 2018-08-05 15:27:01 +08:00 In [1]: text = "A. A 类 - 3.2 B. B 类 - 6.4 C. C 类 - 12.8 D. D 类 - 25.6" In [2]: import regex as re In [3]: re.findall(r'([A-Z])\.\s+(.+?\d\.\d)(?:\s|$)',text) Out[3]: [('A', 'A 类 - 3.2'), ('B', 'B 类 - 6.4'), ('C', 'C 类 - 12.8'), ('D', 'D 类 - 25.6')] 关键在于 里面一个 +? ,用对地方就行 |
![]() | 9 guiqiqi OP @imn1 谢谢您的回复,但是我这里这个选项是没有格式限制的,不一定是 `\d\.\d`,当我的数据变成其他格式的时候,+?我这里只匹配到选项后的第一个字符(即没有贪婪匹配): ``` >>> pattern = re.compile(r"(?P<option>\w+)[、\.](?P<content>.+?)") >>> pattern.findall("A.C 类 B.D 类 C.E 类 D.F 类") [('A', 'C'), ('B', 'D'), ('C', 'E'), ('D', 'F')] ``` 我这里中间有的分隔符是用中文顿号分割的,所以写成了 `[、\.]` 的形式。 |
10 co3site 2018-08-05 15:48:08 +08:00 首先你把问题描述清楚,看了你一连串的回复,根本不知道你的目标字符串到底是什么样的 |
![]() | 11 imn1 2018-08-05 15:54:06 +08:00 你这样说的话,基本没法做 我很怀疑每字段不是空格分开,而是<tab> 如果只是空格,又格式不定的话,设计这个 log 格式的人本身就有问题 |
![]() | 12 Kilerd 2018-08-05 16:07:21 +08:00 同 10L,看完下来根本不知道你文本到底是怎样的。表述不清楚。 |
![]() | 13 guiqiqi OP @co3site @Kilerd 不好意思啊,可能表述的不是很清楚,我在这里在多举几个例子可能会好一些: Example 1: A. 13 B. 12 C. 11 D. 10 Example 2: A. 选项 1 B. 选项 2 C. 选项 3 D. 选项 4 Example 3: A. A 类 - 3.2 B. B 类 - 6.4 C. C 类 - 12.8 D. D 类 - 25.6 Example 4: A. C 类 B. D 类 C. E 类 D. F 类 归纳下来数据格式就是: A. 数据 B. 数据 .... 而其中的数据不包含大写字母和 . 的连续组合。希望这里表述的足够清楚。 @imn1 不是 log 哈,老妈最近要有一个考试,她基本不怎么会上网,从网上给她找了些题目,但是格式很不统一,我想用正则提出来入库给她做一个小程序让她练(能实现那种答案做完之后跳出来还有解析的那种,现在就剩答案格式不好提取了),非常感谢回复。 |
![]() | 15 guiqiqi OP @nazor 谢谢!不知道这个分析特殊字符是什么意思,可能是打错了我觉得~,如果是分割特殊字符的话,我实在找不出来固定的特殊字符,因为选项字符串中也含有空格 头大 |
![]() | 16 imn1 2018-08-05 16:33:50 +08:00 ![]() In [14]: re.findall(r'(?:\.\s+)(.+?)(?:\s[A-D]|$)',text) Out[14]: ['A 类 - 3.2', 'B 类 - 6.4', 'C 类 - 12.8', 'D 类 - 25.6'] 放弃直接提取 ABCD,反正按顺序自己添加就行 keyword 是每项开头有「 ABCD.空格」,如果不符合全部我也没办法了 |