正则表达式用括号

时间:2016-03-29 09:35:38

标签: python regex

我希望以[key] value格式从文本中获取关键字和值:

  1. 键由AA,BB,CC修复。
  2. [key](可以为空白)值
  3. 价值可以有' [',']'和新行(\ n)。
  4. value可以为null。
  5. 如果有[DD],则为值。
  6. 例如,

    [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>.*)
    

2 个答案:

答案 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)使^匹配开头一行,而不仅仅是字符串的开头。

请参阅sample Python demo

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'}