鱼C论坛

 找回密码
 立即注册
查看: 2700|回复: 13

有关正则表达式的问题

[复制链接]
发表于 2023-4-23 10:13:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


re.findall("\d+、:[ABCD]", data_all)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-23 10:24:05 | 显示全部楼层
你好!

根据你的需求,你可以使用以下正则表达式来匹配字符串:
\d+、.*:[ABCD]

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

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

这将返回一个列表,其中包含所有匹配的字符串。希望这可以帮到你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 10:29:42 | 显示全部楼层
isdkz 发表于 2023-4-23 10:24
你好!

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

刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以
单匹配结尾,也可以
合在一起就不行,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-23 10:31:00 | 显示全部楼层
pysunred 发表于 2023-4-23 10:29
刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以

你原来的字符是什么?可以脱敏给要匹配的那部分给我看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 10:31:54 | 显示全部楼层
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 10:32:33 | 显示全部楼层
isdkz 发表于 2023-4-23 10:31
你原来的字符是什么?可以脱敏给要匹配的那部分给我看看

就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


所以你是要匹配出一道一道的题目,不要答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你可以使用正向查找断言 `(?=...)` 来匹配每一道题目。这里是一个简化的正则表达式:
\d+、.*(?:\n[A-D]\..*){4}(?=\n答案)

这个正则表达式使用了正向查找断言 `(?=\n答案)`,它表示匹配的内容后面应该跟着“答案”。`(?:\n[A-D]\..*){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[A-D]\..*){4}(?=\n答案)", data_all)
print(result)

这将返回一个列表,其中包含所有匹配的题目及选项,而不包括答案。希望这次能满足你的需求!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11,19,25 这样下去,只匹配了36道题目。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

不过,我现在有一个想法,就是先拿到题号的下标,再拿到答案的下标,然后获取2个下标之间的数据,就可以实现题目和答案变成一个元素。
然后再针对这个元素进行查找了分割。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这个是后面有答案的才会匹配到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以你是要分别取出题目、每一个选项和答案?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 11:33:14 | 显示全部楼层
isdkz 发表于 2023-4-23 11:20
所以你是要分别取出题目、每一个选项和答案?

我现在用另外一种方法,把所有答案都放在一个列表中,
但是因为答案都是ABCD,会重复
现在面临的问题是,通过过循环进行定位下标的时候,
因为重复,循环又从头开始,就会定位到前面出现过的下标,而后面需要的下标就无法查找出来。
要如何才可以从字符串头开始查找,找到一个,就继续从这个位置查找下一个,而不是从头开始查找。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-23 11:50:53 | 显示全部楼层
本帖最后由 isdkz 于 2023-4-23 11:54 编辑
pysunred 发表于 2023-4-23 11:33
我现在用另外一种方法,把所有答案都放在一个列表中,
但是因为答案都是ABCD,会重复
现在面临的问题是 ...


不明白你说什么

不过我有自己的想法,这种半结构化的数据可以用谷歌开源的 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 ([A-D]\..+)
Value Answer ([A-D])

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荣誉 +5 鱼币 +5 贡献 +3 收起 理由
ciwmy + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 08:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表