RegEX:如何在字符串之间排除并匹配重命名字符串

时间:2018-10-02 20:25:54

标签: python regex

我确实进行了逆运算,在两个字符串之间匹配并排除了其余的字符串,但是我并没有否认第一句话。

字符串:

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

RegEX:(?=iso)(.*)(?<=:)

结果:匹配iso... STRING:。我想匹配所有十六进制地址。

2 个答案:

答案 0 :(得分:2)

您可以使用

String[] wordList = { "apple", "mango", "berry", "rice", "banana"} ;

int [] map = new int [26]; //by default all elements initialized with 0
for(int i =0; i < wordList.length; i++){
     char first = wordList[i].charAt(0);
     int index = first - 'a';
     map[index] = map[index] + 1;
}

输出:

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)

请参见Python demo

Hex-STRING:(?:\s+[\dA-Fa-f]{2})+模式将匹配[['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']] ,然后匹配1次或多次重复1+个空格,然后匹配2个十六进制字符,并尽可能地匹配。这些匹配项将用作第二个正则表达式Hex-STRING:的输入,第二个正则表达式将从这些预先提取的字符串中提取所有预期结果。

[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}模式将两个十六进制字符与[\dA-Fa-f]{2}(?:\s+[\dA-Fa-f]{2}){5}匹配,[\dA-Fa-f]{2}匹配五个连续出现的1+空格,后跟两个十六进制字符。

列表(?:\s+[\dA-Fa-f]{2}){5}的理解有助于用单个空格替换十六进制对之间的换行符。

答案 1 :(得分:1)

如果您只是想匹配每行末尾的十六进制值,则应该足够:

user.r

这将匹配Hex-STRING:\s*(.*)$,后跟任何空格,然后捕获所有内容,直到该行的末尾。

以下是使用您提供的输入的示例:https://regex101.com/r/1TKKcf/2