鱼C论坛

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

有关正则表达式的问题

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

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

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

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


re.findall("\d+、:[ABCD]", data_all)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  1. \d+、.*:[ABCD]
复制代码


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

  1. import re

  2. data_all = "你的字符串"
  3. result = re.findall("\d+、.*:[ABCD]", data_all)
  4. print(result)
复制代码


这将返回一个列表,其中包含所有匹配的字符串。希望这可以帮到你!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以
单匹配结尾,也可以
合在一起就不行,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你原来的字符是什么?可以脱敏给要匹配的那部分给我看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


所以你是要匹配出一道一道的题目,不要答案?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  1. \d+、.*(?:\n[A-D]\..*){4}(?=\n答案)
复制代码


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

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

  1. import re

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

  16. result = re.findall("\d+、.*(?:\n[A-D]\..*){4}(?=\n答案)", data_all)
  17. print(result)
复制代码


这将返回一个列表,其中包含所有匹配的题目及选项,而不包括答案。希望这次能满足你的需求!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11,19,25 这样下去,只匹配了36道题目。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

这个是后面有答案的才会匹配到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以你是要分别取出题目、每一个选项和答案?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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


不明白你说什么

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

使用之前得先安装:
  1. pip install textfsm
复制代码


参考代码:
  1. import textfsm

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

  16. template = """Value Number (\d+)
  17. Value Question (.+)
  18. Value List Option ([A-D]\..+)
  19. Value Answer ([A-D])

  20. Start
  21.   ^${Number}、${Question}
  22.   ^${Option}
  23.   ^答案:${Answer} -> Continue.Record
  24.   ^\s* -> Record
  25. """

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

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

  30. result = fsm.ParseText(data)

  31. for item in result:
  32.     number, question, options, answer = item
  33.     print(f"问题 {number}: {question}")
  34.     print("选项:")
  35.     for option in options:
  36.         print(option)
  37.     print(f"答案: {answer}")
  38.     print()
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
ciwmy + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-28 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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