如何使用此RegEx或更好的方式提取我想要的信息?

时间:2016-10-18 19:53:57

标签: python regex

所以这是我到目前为止的正则表达式。

r"(?s)(?<=([A-G][1-3])).*?(?=[A-G][1-3]|$)"

看起来后面跟着A-G和1-3之间的数字以及展望未来的数字。我已使用Regex101对其进行了测试。 Here's what it returns for each match

这是我正在测试的字符串,

"A1 **ACBFEKJRQ0Z+-** F2 **.,12STLMGHD** F1 **9)(** D2 **!?56WXP** C1 **IONVU43\"\'** E1 **Y87><** A3 **-=.,\'\"!?><()@**"

(字符串不应该有任何空格,但我需要在每个字母之后加上一个数字后面跟一个数字,以便更容易看到我想要的内容)

我想要它做的是将值存储在组的每个匹配项之间(&#34;完全匹配&#34;)以及它们重合的组的匹配项以便稍后使用。

最后,我想以元组列表或字典结束,例如:

dict = {"A1":"ACBFEKJRQ0Z+-", "F2":",12STLMGHD", "F1":"9)(", "next group match":"characters that follow"}

list_of_tuples = (["A1","ACBFEKJRQ0Z+-"], ["F2","12STLMGHD"], ["F1","9)("], ["next group match","characters that follow"])

与RegEx相比较的字符串不会像&#34; C1F2&#34;顺便说一句

P.S。请原谅可怕的解释,非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

我建议

(?s)([A-G][1-3])((?:(?![A-G][1-3]).)*)

请参阅regex demo

(?s).匹配换行符,([A-G][1-3])会将大写字母+数字捕获到第1组,((?:(?![A-G][1-3]).)*)将匹配所有未启动的文本大写字母+数字序列。

可以将同一个正则表达式展开为([A-G][1-3])([^A-G]*(?:[A-G](?![1-3])[^A-G]*)*)以获得更好的效果(不需要re.DOTALL修饰符或(?s))。请参阅this demo

Python demo

import re
regex = r"(?s)([A-G][1-3])((?:(?![A-G][1-3]).)*)"
test_str = """A1 ACBFEKJRQ0Z+-F2.,12STLMGHDF19)(D2!?56WXPC1IONVU43"'E1Y87><A3-=.,'"!?><()@"""
dct = dict(re.findall(regex, test_str))
print(dct)