正则表达式:如何在字符串之间排除并匹配重命名字符串
RegEX: How to exclude between string and to match the renaming string
我确实进行了逆运算,在两个字符串之间进行匹配并排除其余字符串,但我并没有否认第一句话。
字符串:
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.11.19 = Hex-STRING: 14 CC 20 B7 F5 D1 70 4F 57 4C D3 95
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.12.21 = Hex-STRING: 18 A6 F7 80 27 6F C4 E9 84 A8 B9 B1 18 A6 F7 80
32 B3
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.13.22 = Hex-STRING: 30 B5 C2 CE 55 81 C4 E9 84 BD 58 E5
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.16.25 = Hex-STRING: 18 A6 F7 65 A5 75 C4 E9 84 CB CC 61 B0 4E 26 8B
4E E5 B0 4E 26 8B 41 E7 84 16 F9 92 EA CB C4 E9
84 A8 C1 3D
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.17.29 = Hex-STRING: 70 4F 57 4C CB FF 70 4F 57 39 5E 33
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.18.38 = Hex-STRING: 98 DE D0 D3 4E 7D 18 A6 F7 80 3D 41 84 16 F9 AF
E2 AF 9C 6F 52 12 08 A7
正则表达式:(?=iso)(.*)(?<=:)
结果:匹配 iso... STRING:
。我想匹配所有十六进制地址。
如果您只是想匹配每行末尾的十六进制值,像这样就足够了:
Hex-STRING:\s*(.*)$
这将匹配 Hex-STRING
后跟任何空格,然后捕获所有内容直到行尾。
这是一个使用您提供的输入的示例:https://regex101.com/r/1TKKcf/2
您可以使用
import re
s = "YOUR_DATA"
results = []
for match in re.findall(r'Hex-STRING:(?:\s+[\dA-Fa-f]{2})+', s):
results.append([" ".join(x.split()) for x in re.findall(r'[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}', match)])
print(results)
输出:
[['14 CC 20 B7 F5 D1', '70 4F 57 4C D3 95'], ['18 A6 F7 80 27 6F', 'C4 E9 84 A8 B9 B1', '18 A6 F7 80 32 B3'], ['30 B5 C2 CE 55 81', 'C4 E9 84 BD 58 E5'], ['18 A6 F7 65 A5 75', 'C4 E9 84 CB CC 61', 'B0 4E 26 8B 4E E5', 'B0 4E 26 8B 41 E7', '84 16 F9 92 EA CB', 'C4 E9 84 A8 C1 3D'], ['70 4F 57 4C CB FF', '70 4F 57 39 5E 33'], ['98 DE D0 D3 4E 7D', '18 A6 F7 80 3D 41', '84 16 F9 AF E2 AF', '9C 6F 52 12 08 A7']]
参见Python demo。
Hex-STRING:(?:\s+[\dA-Fa-f]{2})+
模式将匹配 Hex-STRING:
,然后 1 次或多次重复 1+ whitespaces,然后是 2 个十六进制字符,尽可能多次。这些匹配项将用作第二个正则表达式 [\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}
的输入,它将从那些预提取的字符串中提取所有预期结果。
[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}
模式匹配带有 [\dA-Fa-f]{2}
的两个十六进制字符,(?:\s+[\dA-Fa-f]{2}){5}
匹配五个连续出现的 1+ whitespaces 后跟两个十六进制字符。
[" ".join(x.split()) for x in re.findall(...)]
列表理解有助于用单个 space.
替换十六进制对之间的换行符
我确实进行了逆运算,在两个字符串之间进行匹配并排除其余字符串,但我并没有否认第一句话。
字符串:
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.11.19 = Hex-STRING: 14 CC 20 B7 F5 D1 70 4F 57 4C D3 95
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.12.21 = Hex-STRING: 18 A6 F7 80 27 6F C4 E9 84 A8 B9 B1 18 A6 F7 80
32 B3
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.13.22 = Hex-STRING: 30 B5 C2 CE 55 81 C4 E9 84 BD 58 E5
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.16.25 = Hex-STRING: 18 A6 F7 65 A5 75 C4 E9 84 CB CC 61 B0 4E 26 8B
4E E5 B0 4E 26 8B 41 E7 84 16 F9 92 EA CB C4 E9
84 A8 C1 3D
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.17.29 = Hex-STRING: 70 4F 57 4C CB FF 70 4F 57 39 5E 33
iso.3.6.1.4.1.25355.3.2.6.4.2.5.1.7.3.2.18.38 = Hex-STRING: 98 DE D0 D3 4E 7D 18 A6 F7 80 3D 41 84 16 F9 AF
E2 AF 9C 6F 52 12 08 A7
正则表达式:(?=iso)(.*)(?<=:)
结果:匹配 iso... STRING:
。我想匹配所有十六进制地址。
如果您只是想匹配每行末尾的十六进制值,像这样就足够了:
Hex-STRING:\s*(.*)$
这将匹配 Hex-STRING
后跟任何空格,然后捕获所有内容直到行尾。
这是一个使用您提供的输入的示例:https://regex101.com/r/1TKKcf/2
您可以使用
import re
s = "YOUR_DATA"
results = []
for match in re.findall(r'Hex-STRING:(?:\s+[\dA-Fa-f]{2})+', s):
results.append([" ".join(x.split()) for x in re.findall(r'[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}', match)])
print(results)
输出:
[['14 CC 20 B7 F5 D1', '70 4F 57 4C D3 95'], ['18 A6 F7 80 27 6F', 'C4 E9 84 A8 B9 B1', '18 A6 F7 80 32 B3'], ['30 B5 C2 CE 55 81', 'C4 E9 84 BD 58 E5'], ['18 A6 F7 65 A5 75', 'C4 E9 84 CB CC 61', 'B0 4E 26 8B 4E E5', 'B0 4E 26 8B 41 E7', '84 16 F9 92 EA CB', 'C4 E9 84 A8 C1 3D'], ['70 4F 57 4C CB FF', '70 4F 57 39 5E 33'], ['98 DE D0 D3 4E 7D', '18 A6 F7 80 3D 41', '84 16 F9 AF E2 AF', '9C 6F 52 12 08 A7']]
参见Python demo。
Hex-STRING:(?:\s+[\dA-Fa-f]{2})+
模式将匹配 Hex-STRING:
,然后 1 次或多次重复 1+ whitespaces,然后是 2 个十六进制字符,尽可能多次。这些匹配项将用作第二个正则表达式 [\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}
的输入,它将从那些预提取的字符串中提取所有预期结果。
[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}
模式匹配带有 [\dA-Fa-f]{2}
的两个十六进制字符,(?:\s+[\dA-Fa-f]{2}){5}
匹配五个连续出现的 1+ whitespaces 后跟两个十六进制字符。
[" ".join(x.split()) for x in re.findall(...)]
列表理解有助于用单个 space.