pysunred 发表于 2023-4-23 10:13:06

有关正则表达式的问题

友友好,
      我想用正则表达式匹配字符串,开成一个列表。
匹配以\d+、开头,以: 结尾,中间没要求。
现在我开头,结尾写好了,中间不用匹配,
要用什么方式表达呢?
谢谢友友!!!


re.findall("\d+、:", data_all)

isdkz 发表于 2023-4-23 10:24:05

你好!

根据你的需求,你可以使用以下正则表达式来匹配字符串:

\d+、.*:


其中 `.*` 用于匹配任意数量的任意字符(中间没有要求)。你可以在 `re.findall()` 函数中使用这个正则表达式:

import re

data_all = "你的字符串"
result = re.findall("\d+、.*:", data_all)
print(result)


这将返回一个列表,其中包含所有匹配的字符串。希望这可以帮到你!

pysunred 发表于 2023-4-23 10:29:42

isdkz 发表于 2023-4-23 10:24
你好!

根据你的需求,你可以使用以下正则表达式来匹配字符串:


刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以
单匹配结尾,也可以
合在一起就不行,

isdkz 发表于 2023-4-23 10:31:00

pysunred 发表于 2023-4-23 10:29
刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以


你原来的字符是什么?可以脱敏给要匹配的那部分给我看看

pysunred 发表于 2023-4-23 10:31:54

1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D

pysunred 发表于 2023-4-23 10:32:33

isdkz 发表于 2023-4-23 10:31
你原来的字符是什么?可以脱敏给要匹配的那部分给我看看

就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D

isdkz 发表于 2023-4-23 10:35:04

pysunred 发表于 2023-4-23 10:32
就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失 ...

所以你是要匹配出一道一道的题目,不要答案?

isdkz 发表于 2023-4-23 10:44:07

pysunred 发表于 2023-4-23 10:32
就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失 ...

你可以使用正向查找断言 `(?=...)` 来匹配每一道题目。这里是一个简化的正则表达式:

\d+、.*(?:\n\..*){4}(?=\n答案)


这个正则表达式使用了正向查找断言 `(?=\n答案)`,它表示匹配的内容后面应该跟着“答案”。`(?:\n\..*){4}` 表示匹配换行符后跟一个大写字母 A-D,紧接着一个点和任意字符,重复 4 次。

你可以在 `re.findall()` 函数中使用这个正则表达式:

import re

data_all = '''
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D
'''

result = re.findall("\d+、.*(?:\n\..*){4}(?=\n答案)", data_all)
print(result)


这将返回一个列表,其中包含所有匹配的题目及选项,而不包括答案。希望这次能满足你的需求!

pysunred 发表于 2023-4-23 11:09:52

isdkz 发表于 2023-4-23 10:44
你可以使用正向查找断言 `(?=...)` 来匹配每一道题目。这里是一个简化的正则表达式:




我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11,19,25 这样下去,只匹配了36道题目。

pysunred 发表于 2023-4-23 11:14:41

pysunred 发表于 2023-4-23 11:09
我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11, ...

因为有些题目是不可能换行不规则,
我要的本意,就是中间不管是啥,
只要匹配前后就可以,
先把题目和答案变成一个元素,
再对元素进行查找,就可以把题目,选项,答案分开

不过,我现在有一个想法,就是先拿到题号的下标,再拿到答案的下标,然后获取2个下标之间的数据,就可以实现题目和答案变成一个元素。
然后再针对这个元素进行查找了分割。

isdkz 发表于 2023-4-23 11:15:58

pysunred 发表于 2023-4-23 11:09
我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11, ...

这个是后面有答案的才会匹配到

isdkz 发表于 2023-4-23 11:20:03

pysunred 发表于 2023-4-23 11:14
因为有些题目是不可能换行不规则,
我要的本意,就是中间不管是啥,
只要匹配前后就可以,


所以你是要分别取出题目、每一个选项和答案?

pysunred 发表于 2023-4-23 11:33:14

isdkz 发表于 2023-4-23 11:20
所以你是要分别取出题目、每一个选项和答案?

我现在用另外一种方法,把所有答案都放在一个列表中,
但是因为答案都是ABCD,会重复
现在面临的问题是,通过过循环进行定位下标的时候,
因为重复,循环又从头开始,就会定位到前面出现过的下标,而后面需要的下标就无法查找出来。
要如何才可以从字符串头开始查找,找到一个,就继续从这个位置查找下一个,而不是从头开始查找。

isdkz 发表于 2023-4-23 11:50:53

本帖最后由 isdkz 于 2023-4-23 11:54 编辑

pysunred 发表于 2023-4-23 11:33
我现在用另外一种方法,把所有答案都放在一个列表中,
但是因为答案都是ABCD,会重复
现在面临的问题是 ...

不明白你说什么{:10_277:}

不过我有自己的想法,这种半结构化的数据可以用谷歌开源的 textfsm 库来解决

使用之前得先安装:
pip install textfsm

参考代码:
import textfsm

data = """
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D
"""

template = """Value Number (\d+)
Value Question (.+)
Value List Option (\..+)
Value Answer ()

Start
^${Number}、${Question}
^${Option}
^答案:${Answer} -> Continue.Record
^\s* -> Record
"""

with open("template.textfsm", "w") as f:
    f.write(template)

with open("template.textfsm") as f:
    fsm = textfsm.TextFSM(f)

result = fsm.ParseText(data)

for item in result:
    number, question, options, answer = item
    print(f"问题 {number}: {question}")
    print("选项:")
    for option in options:
      print(option)
    print(f"答案: {answer}")
    print()

页: [1]
查看完整版本: 有关正则表达式的问题