有关正则表达式的问题
友友好,我想用正则表达式匹配字符串,开成一个列表。
匹配以\d+、开头,以: 结尾,中间没要求。
现在我开头,结尾写好了,中间不用匹配,
要用什么方式表达呢?
谢谢友友!!!
re.findall("\d+、:", data_all)
你好!
根据你的需求,你可以使用以下正则表达式来匹配字符串:
\d+、.*:
其中 `.*` 用于匹配任意数量的任意字符(中间没有要求)。你可以在 `re.findall()` 函数中使用这个正则表达式:
import re
data_all = "你的字符串"
result = re.findall("\d+、.*:", data_all)
print(result)
这将返回一个列表,其中包含所有匹配的字符串。希望这可以帮到你! isdkz 发表于 2023-4-23 10:24
你好!
根据你的需求,你可以使用以下正则表达式来匹配字符串:
刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以
单匹配结尾,也可以
合在一起就不行, pysunred 发表于 2023-4-23 10:29
刚试了下,不行呢,
匹配的是空的
我单匹配开头,可以
你原来的字符是什么?可以脱敏给要匹配的那部分给我看看 1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D isdkz 发表于 2023-4-23 10:31
你原来的字符是什么?可以脱敏给要匹配的那部分给我看看
就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失业保险费的征缴规定执行。
A.工伤保险费
B.意外保险费
C.医疗保险费
D.人身保险费
答案:A
2、( )对建筑工程安全防护、文明施工措施费用的使用负总责。
A.分包单位
B.转包单位
C.发包单位
D.工程总承包单位
答案:D pysunred 发表于 2023-4-23 10:32
就是单选题目
1、( )的征缴按照《社会保险费征缴暂行条例》关于基本养老保险
费、基本医疗保险费、失 ...
所以你是要匹配出一道一道的题目,不要答案? 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)
这将返回一个列表,其中包含所有匹配的题目及选项,而不包括答案。希望这次能满足你的需求! isdkz 发表于 2023-4-23 10:44
你可以使用正向查找断言 `(?=...)` 来匹配每一道题目。这里是一个简化的正则表达式:
我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11,19,25 这样下去,只匹配了36道题目。 pysunred 发表于 2023-4-23 11:09
我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11, ...
因为有些题目是不可能换行不规则,
我要的本意,就是中间不管是啥,
只要匹配前后就可以,
先把题目和答案变成一个元素,
再对元素进行查找,就可以把题目,选项,答案分开
不过,我现在有一个想法,就是先拿到题号的下标,再拿到答案的下标,然后获取2个下标之间的数据,就可以实现题目和答案变成一个元素。
然后再针对这个元素进行查找了分割。 pysunred 发表于 2023-4-23 11:09
我的本意是匹配到题目和答案为一个元素,
不过我刚试了下这个表达式,
匹配的题目,会漏题,2,8,11, ...
这个是后面有答案的才会匹配到 pysunred 发表于 2023-4-23 11:14
因为有些题目是不可能换行不规则,
我要的本意,就是中间不管是啥,
只要匹配前后就可以,
所以你是要分别取出题目、每一个选项和答案? isdkz 发表于 2023-4-23 11:20
所以你是要分别取出题目、每一个选项和答案?
我现在用另外一种方法,把所有答案都放在一个列表中,
但是因为答案都是ABCD,会重复
现在面临的问题是,通过过循环进行定位下标的时候,
因为重复,循环又从头开始,就会定位到前面出现过的下标,而后面需要的下标就无法查找出来。
要如何才可以从字符串头开始查找,找到一个,就继续从这个位置查找下一个,而不是从头开始查找。
本帖最后由 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]