关于python中使用正则表达式搜索字符串的更好代码的建议
我有一段代码,用于搜索特定的地址块并以某种方式格式化结果 e、 我有一个输入字符串70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000。在这种情况下,我需要提取BEG和END之间的地址,即701D135D和702D72FC,并按以下方式格式化它们:关于python中使用正则表达式搜索字符串的更好代码的建议,python,regex,Python,Regex,我有一段代码,用于搜索特定的地址块并以某种方式格式化结果 e、 我有一个输入字符串70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000。在这种情况下,我需要提取BEG和END之间的地址,即701D135D和702D72FC,并按以下方式格式化它们: [0]0x701D135D [1]0x702D72FC 我为此写了一个剧本: import re import argparse parser = argparse.Argume
[0]0x701D135D
[1]0x702D72FC
我为此写了一个剧本:
import re
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--address', help='Parse the input addresses')
args = parser.parse_args()
addressInfo = args.address
filter = re.compile(r'(BEG )((\w{8})\s)+(END )')
btInfo = filter.search(addressInfo)
print ("\n")
addresses = btInfo.group().split()
for idx in range(len(addresses)):
if((addresses[idx] != 'BEG') and (addresses[idx] != 'END')):
print ("[%d]0x%s" %(idx-1, addresses[idx]))
当我回顾代码时,它更像是c/c++代码而不是python代码。是否有更好的方法在“真正的python风格”中实现相同的结果?使用带有lookback&Lookahead和grouping的re.search
前
使用带lookback和Lookahead以及分组的重新搜索
前
不带re,但拆分并带有索引枚举:
def get_addresses(input_string):
for address in input_string.split(' BEG ')[-1].split(' END ')[0].split(' '):
yield address
foo = "70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000"
for idx, address in enumerate(get_addresses(foo)):
print(f'[{idx}]0x{address}')
使用f字符串需要3.6+
不带re,但拆分并带有索引枚举:
def get_addresses(input_string):
for address in input_string.split(' BEG ')[-1].split(' END ')[0].split(' '):
yield address
foo = "70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000"
for idx, address in enumerate(get_addresses(foo)):
print(f'[{idx}]0x{address}')
使用f字符串需要3.6+
这个怎么样:
import re
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--address', help='Parse the input addresses')
addressInfo = parser.parse_args().address
btInfo = re.search(r' BEG (.*?) END ', addressInfo).group(1)
print("\n")
for index, address in enumerate(btInfo.split()):
print("[{0}]0x{1}".format(index, address))
r'BEG.*?“结束”将得到从乞求到结束之间的一切。通过在for循环中使用eumerate,可以循环分割字符串,同时跟踪索引
代码将给出以下输出:
[0]0x701D135D
[1]0x702D72FC
这个怎么样:
import re
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--address', help='Parse the input addresses')
addressInfo = parser.parse_args().address
btInfo = re.search(r' BEG (.*?) END ', addressInfo).group(1)
print("\n")
for index, address in enumerate(btInfo.split()):
print("[{0}]0x{1}".format(index, address))
r'BEG.*?“结束”将得到从乞求到结束之间的一切。通过在for循环中使用eumerate,可以循环分割字符串,同时跟踪索引
代码将给出以下输出:
[0]0x701D135D
[1]0x702D72FC
使用带有Lookbehind&Lookahead的re.findall比使用re.search更好的原因是?您不需要迭代数据来获取所有值。您的数据只是一行吗?70D76320 BEG 701D135D 702D72FC端EAR0 0000000000000。?或者您有多行?输入是一行stringUpdated代码段。将re.findall与Lookbehind&Lookahead结合使用比使用re.search更好的原因是?您不需要迭代数据来获取所有值。您的数据只是一行吗?70D76320 BEG 701D135D 702D72FC端EAR0 0000000000000。?还是有多行?输入是一行字符串更新的代码段。这真的很酷,谢谢。但我有个问题。与使用for循环从分割结果中逐个获取单个元素相比,使用co例程产生的结果是否有性能?e、 g使用enumerateaddressInfo.splitBEG[-1]中的地址作为索引。拆分结束[0]。拆分:在这种特殊情况下,假设没有太多地址,则不使用def get_addressinput_Strings。实际上没有什么区别。一般情况下,split会在内存中生成列表,而get_地址是生成器,它不会在内存中生成整个列表。此外,它使代码更加结构化,并允许单独测试生成器功能。您可以在这里阅读有关生成器的更多信息事实上,我在外部进行了更正,因此str.split在任何情况下都会在内存中创建列表,因此我之前评论的这一部分也不正确。尽管如此,代码结构更好,易于测试。这真的很酷,谢谢。但我有个问题。与使用for循环从分割结果中逐个获取单个元素相比,使用co例程产生的结果是否有性能?e、 g使用enumerateaddressInfo.splitBEG[-1]中的地址作为索引。拆分结束[0]。拆分:在这种特殊情况下,假设没有太多地址,则不使用def get_addressinput_Strings。实际上没有什么区别。一般情况下,split会在内存中生成列表,而get_地址是生成器,它不会在内存中生成整个列表。此外,它使代码更加结构化,并允许单独测试生成器功能。您可以在这里阅读有关生成器的更多信息事实上,我在外部进行了更正,因此str.split在任何情况下都会在内存中创建列表,因此我之前评论的这一部分也不正确。尽管如此,代码结构更好,易于测试。