Python 匹配除模式外的所有内容,并替换为字符串匹配
我想使用python来操作我拥有的字符串。Python 匹配除模式外的所有内容,并替换为字符串匹配,python,regex,string,Python,Regex,String,我想使用python来操作我拥有的字符串。 基本上,我想在每个十六进制字节之前加上“\x”,但已经加上“\x”的字节除外 我的原始字符串如下所示: mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00" 我想从中创建以下字符串: mystr = r"\x30\x33\x62\x37\x
基本上,我想在每个十六进制字节之前加上“\x”,但已经加上“\x”的字节除外 我的原始字符串如下所示:
mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"
我想从中创建以下字符串:
mystr = r"\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00"
我想用正则表达式匹配除/\x../g之外的所有内容,并用“\x”替换所有匹配项。可悲的是,我与它斗争了很多,但没有任何成功。此外,我不确定使用正则表达式是否是解决这种情况的最佳方法。您不需要正则表达式。您可以使用简单的字符串操作。首先从字符串中删除所有
“\x”
。然后每2个字符添加一次
replaced = mystr.replace(r"\x", "")
newstr = "".join([r"\x" + replaced[i*2:(i+1)*2] for i in range(len(replaced)/2)])
输出:
>>> print(newstr)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
正则表达式:替换:\\x$1
详细信息:
import re
text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
非捕获组(?:)
在零和一次之间匹配,匹配字符串?
(如果存在)\x
捕获组()
匹配列表中的单个字符[]
和0-9
a-Z
精确匹配{n}
次n
String\x\\x
第一组$1
import re
text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
输出:
import re
text = R'30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00'
text = re.sub(R'(?:\\x)?([0-9A-Z]{2})', R'\\x\1', text)
print(text)
\x30\x33\x62\x37\x61\x31\x31\x90\x01\x0A\x90\x02\x14\x6F\x6D\x6D\x61\x6E\x64\x90\x01\x06\x90\x02\x0F\x52\x65\x6C\x61\x74\x90\x01\x02\x90\x02\x50\x65\x6D\x31\x90\x00
您可以获得一个包含您的值的列表,以便按照您的意愿进行操作,并使用更简单的重新模式
mystr = r"30336237613131\x90\x01\x0A\x90\x02\x146F6D6D616E64\x90\x01\x06\x90\x02\x0F52656C6174\x90\x01\x02\x90\x02\x50656D31\x90\x00"
import re
pat = r'([a-fA-F0-9]{2})'
match = re.findall(pat, mystr)
if match:
print('\n\nNew string:')
print('\\x' + '\\x'.join(match))
#for elem in match: # match gives you a list of strings with the hex values
# print('\\x{}'.format(elem), end='')
print('\n\nOriginal string:')
print(mystr)
这可以在不替换现有的
\x
的情况下通过使用正向lookbehind和反向lookahead的组合来完成
(?!(?<=\\x)|(?<=\\x[a-f\d]))([a-f\d]{2})
(?!(?谢谢!介意解释第一部分,直到第二部分吗?)?优雅的回答,我喜欢!谢谢!