我希望以[key] value
格式从文本中获取关键字和值:
例如,
[AA] abcd 1234 !@#$ _+{}[]:"
blah blah
[abc-def] this is also value.
[BB]abcd defg
[CC] (can null)
我的Python代码是这样的:
import re
text ='''
[AA] abcd 1234 !@#$ _+{}[]:"
blah blah
[abc-def] this is also value.
[BB]abcd defg
[CC]
'''
pattern = re.compile(this is what I want)
result = {m.group('field'):m.group('value') for m in pattern.finditer(text)}
如果值只是这样的一行
[AA] abcd 1234 !@#$ _+{}[]:"
[BB]abcd defg
[CC]
然后我可以使用下面的正则表达式,你可以看到https://regex101.com/r/rS8oM1/1
\[(?P<key>AA|BB|CC)\]\s*(?P<value>.*)
答案 0 :(得分:0)
在应用正则表达式之前,请先排好一行,让您的生活更轻松:
>>> text ='''
... [AA] abcd 1234 !@#$ _+{}[]:"
... blah blah
... [BB]abcd defg
... [CC]
... '''
>>> print(text)
[AA] abcd 1234 !@#$ _+{}[]:"
blah blah
[BB]abcd defg
[CC]
>>> newtext=''
>>> for line in text.split('\n'):
... newtext=newtext+('\n' if re.match('^\[\w\w\]', line) else '')+line
...
>>> print(newtext)
[AA] abcd 1234 !@#$ _+{}[]:"blah blah
[BB]abcd defg
[CC]
>>> for i in newtext.split('\n'):
... print(re.findall(r'^\[(\w\w)\](.*)$',i))
...
[]
[('AA', ' abcd 1234 !@#$ _+{}[]:"blah blah')]
[('BB', 'abcd defg')]
[('CC', '')]
>>>
Edit1:使用自定义输入..
$ cat a.py
import re
text ='''
[AA] abcd
[abcd]
[BB]abcd defg
[CC]
'''
newtext=''
for line in text.split('\n'):
newtext=newtext+('\n' if re.match('^\[\w\w\]', line) else '')+line
for i in newtext.split('\n'):
print(re.findall(r'^\[(\w\w)\](.*)$',i))
$ python a.py
[]
[('AA', ' abcd[abcd]')]
[('BB', 'abcd defg')]
[('CC', '')]
$
答案 1 :(得分:0)
我假设您只需要获取密钥(仅在一行开头的[AA]
或[BB]
或[CC]
)和 value (三个替代键之后的所有文本以及字符串的下一个键或结尾之前)。
您可以使用基于淬火贪婪令牌的正则表达式作为否定字符类的同义词,用于字符序列:
(?sm)^\[(?P<key>AA|BB|CC)\]\s*(?P<value>(?:(?!\n\[(?:AA|BB|CC)]).)*)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
请参阅regex demo
(?:(?!\n\[(?:AA|BB|CC)]).)*
淬火贪婪令牌匹配任何非\n[AA]
或\n[BB]
或\n[CC]
的文字。
(?sm)
是内嵌修饰符:(?s)
启用DOTALL模式(.
也开始匹配换行符)和(?m)
使^
匹配开头一行,而不仅仅是字符串的开头。
import re
text ='''
[AA] abcd 1234 !@#$ _+{}[]:"
blah blah
[abc-def] this is also value.
[BB]abcd defg
[CC]
'''
pattern = re.compile(r'(?sm)^\[(?P<key>AA|BB|CC)\]\s*(?P<value>(?:(?!\n\[(?:AA|BB|CC)]).)*)')
result = {m.group('key'):m.group('value') for m in pattern.finditer(text)}
print(result)
# => {'AA': 'abcd 1234 !@#$ _+{}[]:"\nblah blah\n[abc-def] this is also value.', 'CC': '', 'BB': 'abcd defg'}