0

例如:

blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|

必须成为

blahblahx0Ax4Dx5Ex43adfsdasdx92 sgagrewasx12x5E

我正在尝试一些类似的东西:re.sub(r'\|(\w+ ?)*\|', r'x\1', a)但是我很难让它在第一场比赛之外发挥作用。

更新:看起来正则表达式不是一个好的选择。pyparsing 解决方案可行吗?

如果没有,我可以编写一个简单的迭代解决方案,但我更喜欢可扩展的东西。但我很难让它比第一场比赛更有效。

UPDATE2:我最后使用了纯python方法,它工作正常,也可以处理转义字符。

def strtohex(self, string):
    hexmode = False
    hexstring = ''
    i=0
    while i<len(string):
        if string[i] == '\\':
            i += 1
            #No escape charecters inside hex pipes
            hexstring += string[i]   
        elif string[i] == '|':
            hexmode = not hexmode
        elif string[i] == ' ':
            hexstring += '' if hexmode else  ' '
        else:
            if hexmode:
                hexstring += chr(int(string[i:i+2],16))
                i += 1
            else:
                hexstring += string[i]

        i += 1
    return hexstring
4

4 回答 4

1

这是 pyparsing 中的样子:

from pyparsing import Word,hexnums,Suppress,OneOrMore

twoDigitHex = Word(hexnums,exact=2)
VERT = Suppress('|')

pattern = VERT + OneOrMore(twoDigitHex) + VERT

# attach parse action to prefix each 2-digit hex with 'x' and join all together
pattern.setParseAction(lambda t: ''.join('x'+tt for tt in t))

# take sample code, and use transformString to apply conversion
sample = "blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|"
print pattern.transformString(sample)

印刷

blahblahx0Ax4Dx5Ex43adfsdasdx92 sgagrewasx12x5E
于 2013-02-21T17:12:35.683 回答
1

我敢肯定你可以只使用正则表达式来做到这一点,但为什么要麻烦呢?使用您的编程语言很简单:

在竖线处折断你的绳子。检查并酌情替换。重组。

line = 'blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|'
parts = line.split('|')
for i, s in enumerate(parts):
    if re.match(r'^([\dA-F]{2} )*[\dA-F]$', s):
    parts[i] = re.sub('^| ', 'x', s)
result = "".join(parts)

检查整个子字符串是否由以空格分隔的两位十六进制数字组成。我假设所有的十六进制字母都是大写的,就像你的例子一样。

于 2013-02-18T15:08:31.810 回答
0

我不认为 python 能够平衡正则表达式。据我所知,.NET 是唯一具有这种支持的风格(而且它看起来很丑,维护起来也很糟糕)。

您最好在管道符号上拆分字符串,然后重新加入字符串,在奇数字符串数组项上应用所需的格式(如果需要,通过正则表达式)。

编辑:再想一想,我相信这可以使用带有可变长度表达式的lookbehind,但不幸的是python不支持这些。(例如,类似的东西(?<=^(?:[^|]*\|[^|]*\|)*[^|]*)\|(\w+ ?)*\|

于 2013-02-18T14:43:41.207 回答
0

我进行了两次:

  • 第一次替换每个十六进制值
  • 然后删除空白和|

它给:

>>> s = 'blahblah|0A 4D 5E 43|adfsdasd|92| sgagrewas|12 5E|'
>>> re.sub(r'[| ]', r'', re.sub(r' ?([0-9A-F]{2})', r'x\1', s))
'blahblahx0Ax4Dx5Ex43adfsdasdx92sgagrewasx12x5E'
于 2013-02-18T14:25:51.670 回答