Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于python中使用正则表达式搜索字符串的更好代码的建议_Python_Regex - Fatal编程技术网

关于python中使用正则表达式搜索字符串的更好代码的建议

关于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

我有一段代码,用于搜索特定的地址块并以某种方式格式化结果

e、 我有一个输入字符串70D76320 BEG 701D135D 702D72FC END EAR0 00000000 0000000。在这种情况下,我需要提取BEG和END之间的地址,即701D135D和702D72FC,并按以下方式格式化它们:

[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在任何情况下都会在内存中创建列表,因此我之前评论的这一部分也不正确。尽管如此,代码结构更好,易于测试。