gpt4 book ai didi

python - 在 txt 文件中找到关键字后,是否有更好的方法来验证字符串模式?

转载 作者:行者123 更新时间:2023-12-05 02:26:22 26 4
gpt4 key购买 nike

我正在尝试检查输入文件中的字符串并使用 re 来组合模式和解析的输入文件。在这里,输入是包含多行 sql 脚本的 csv 文件,我想按顺序验证字符串,比如先检查 keyword1,然后检查 ketword2,然后在输入 csv 文件的每一行中检查 keyword3。通过这样做,我使用了 for 循环,但我觉得必须有更好的方法来处理这个问题。有人建议如何解决这个问题吗?

用例

CREATE application vat4_xyz_rcc_clm1_trm_soc WITH some text
CREATE flow flow_src_vat4_xyz_rcc_clm1_trm_soc some text
CREATE stream main_stream_vat4_xyz_rcc_clm1_trm_soc with some text
CREATE OR REPLACE target comp_tgt_vat4_xyz_rcc_clm1_trm_soc some text

为了处理这个问题,我尝试了这个:

kword=['CREATE','CREATE OR REPLACE']
with open('myinput.txt', 'r+') as f:
lines = f.readlines()
nlines = [v for v in lines if not v.isspace()]
for line in nlines:
for string in line:
for word in kword:
if string is word:
atype=next(string)
print('type is', atype) # such as application, flow, stream

if atype in ['application', 'flow', 'steam']:
value=next(atype) ## such as vat4_xyz_rcc_clm1_trm_soc, flow_src_vat4_xyz_rcc_clm1_trm_soc
print("name", value)
else:
print("name not found")
else:
print("type is not correct")

但这样做并不是高效的代码。我认为 re 在这里可能会做得很好。有人对此有更好的想法吗?

目标:

基本上,我需要解析每一行,如果我发现关键字 1,例如 CREATE,然后检查 ketword1 旁边的词,如果下一个词是 application,然后打印它并检查它的下一个词,我在那里组成模式如下:

vat4_xyz_rcc_clm1_trm_soc
pat1=r'^[\vat\d+]_(?:xyz|abs)_rcc_[clm\d+]_trm_(?:soc|aws)'
m=re.match(pat1, curStr, re.M)

这里是每行有不同模式的情况,例如

pat1=r'^[\vat\d+]_(?:xyz|abs)_rcc_[clm\d+]_trm_(?:soc|aws)'
pat2=r'^\flow_src_[\vat\d+]_(?:xyz|abs)_rcc_[clm\d+]_trm_(?:soc|aws)'
pat3=r'^\main_stream_[\vat\d+]_(?:xyz|abs)_rcc_[clm\d+]_trm_(?:soc|aws)'
pat4=r'^\comp_tgt_[\vat\d+]_(?:xyz|abs)_rcc_[clm\d+]_trm_(?:soc|aws)'

我们怎样才能使使用 re 解析每一行变得简单?有什么想法吗?

最佳答案

正则表达式似乎比您正在尝试的要简单得多。这个怎么样:

import re

matcher = re.compile(r"^(CREATE(?: OR REPLACE)?) (\S+) (\S+).*$")

with open("test.txt", "r") as f:
for line in f:
if match := matcher.match(line):
action, action_type, value = match.groups()
print(f"{action=}, {action_type=}, {value=}")

输出:

action='CREATE', action_type='application', value='vat4_xyz_rcc_clm1_trm_soc'
action='CREATE', action_type='flow', value='flow_src_vat4_xyz_rcc_clm1_trm_soc'
action='CREATE', action_type='stream', value='main_stream_vat4_xyz_rcc_clm1_trm_soc'
action='CREATE OR REPLACE', action_type='target', value='comp_tgt_vat4_xyz_rcc_clm1_trm_soc'

如果您想进一步验证这些值,我会从第一个正则表达式中获取结果,并将它们通过管道传输到针对每种情况的更专业的正则表达式中。

import re

line_matcher = re.compile(r"^(CREATE(?: OR REPLACE)?) (\S+) (\S+).*$")
value_matchers = {
"application": re.compile(r'^vat\d+_(xyz|abs)_rcc_clm\d+_trm_(soc|aws)'),
"flow": re.compile(r'^flow_src_vat\d+_(xyz|abs)_rcc_clm\d+_trm_(soc|aws)'),
"stream": re.compile(r'^main_stream_vat\d+_(xyz|abs)_rcc_clm\d+_trm_(soc|aws)'),
"target": re.compile(r'^comp_tgt_vat\d+_(xyz|abs)_rcc_clm\d+_trm_(soc|aws)'),
}

with open("test.txt", "r") as file:
for line in file:
if not (line_match := line_matcher.match(line)):
print(f"Invalid line: {line=}")
continue

action, action_type, value = line_match.groups()
if not (value_matcher := value_matchers.get(action_type)):
print(f"Invalid action type: {line=}")
continue

if not value_matcher.match(value):
print(f"Invalid {action_type} value: {line=}")
continue

# Do some work on the items
...

关于python - 在 txt 文件中找到关键字后,是否有更好的方法来验证字符串模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73821021/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com