繁体   English   中英

Python - 使用正则表达式提取两个标记之间的子字符串

[英]Python - Use regex to extract substrings between two markers

我有一个需要帮助的问题。 我有以下字符串,需要执行以下操作:

  1. 提取等号和“END=STRING”字符串或右双引号之间的所有子字符串。
  2. 将提取的子字符串分组到一个组中
  3. 不显示 output 中的开始和结束标记
  4. 如果可能,不要显示反斜杠或换行符

两个扩展结果样本:

STRING database file 2025.01 ABC_ONE ABC_TWO

STRING database file 2025.01 ABC_ONE:12.3456 ABC_TWO:12.3456 ABC_THREE:12.3456 ABC_FOUR:12.3456 ABC_THREE:12.3456 ABC_FOUR:12.3456 ABC_FIVE:12.3456 ABC_SIX:12.3456 ABC_SEVEN:12.3456 ABC_EIGHT:12.3456 ABC_NINE:12.3456 ABC_TEN:12.3456

我将使用 Python re.finditer 循环遍历从正则表达式获得的结果。 此外,将使用 re.MULTILINE 和 re.IGNORECASE。

链接到我在 regex101 上的内容: https://regex101.com/r/CwMaEZ/1

随意提出不同的模式,但请记住以下几点:

  1. 就像我在我的模式中展示的那样,需要组。
  2. 我想迭代 Python 中的结果,所以我更喜欢 re.finditer

这是我到目前为止的正则表达式:

(STRING)\s([a-zA-Z0-9/+._-]+)\s([a-zA-Z0-9/+._-]+)\s([a-zA-Z0-9/+._-]+)\s([a-zA-Z0-9/+._-]+)?\s?\\?\n?(.*VALUE=\s*\"?)

以下是字符串:

STRING database file 2025.01 \
     0123456789ABCD VALUE="ABC_ONE \
     ABC_TWO " END=STRING
     ST=

STRING database file 2025.01 \
     0123456789ABCD VALUE=ABC_ONE \
     ABC_TWO END=STRING
     ST=

STRING database file 2025.01 ABCDEFGH123456 \
     VALUE=ABC_ONE ABC_TWO END=STRING 

STRING database file 2025.01 \
    VALUE=ABC_ONE:12.3456 END=STRING \
    AAAA=ABCDEFGH1234

STRING database file 2025.01 \
    VALUE="ABC_ONE:12.3456 ABC_TWO:12.3456 \
    ABC_THREE:12.3456 ABC_FOUR:12.3456 " \
    END=STRING \

STRING database file 2025.01 \
    0123456789ABCD VALUE="ABC_ONE ABC_TWO " \
    END=STRING 

STRING database file 2025.01 VALUE="ABC_ONE \
    ABC_TWO ABC_THREE END=STRING

STRING database file 2025.01 \
    VALUE="ABC_ONE ABC_TWO ABC_THREE " END=STRING

STRING database file 2025.01 VALUE=
    "ABC_ONE ABC_TWO ABC_THREE " END=STRING \

STRING database file 2025.01 VALUE="ABC_ONE \
    ABC_TWO ABC_THREE " END=STRING

STRING database file 2025.01 VALUE="ABC_ONE ABC_TWO \
    ABC_THREE " END=STRING

STRING database file 2025.01 VALUE="ABC_ONE ABC_TWO ABC_THREE " \

STRING database file 2025.01 \
    VALUE="ABC_ONE:12.3456 ABC_TWO:12.3456 \
    ABC_THREE:12.3456 ABC_FOUR:12.3456 \
    ABC_THREE:12.3456 ABC_FOUR:12.3456 \
    ABC_FIVE:12.3456 ABC_SIX:12.3456 \
    ABC_SEVEN:12.3456 ABC_EIGHT:12.3456 \
    ABC_NINE:12.3456 ABC_TEN:12.3456 \
    ABC_ELEVEN:12.3456 ABC_TWELVE:12.3456 \
    END=STRING

提问者通常被期望为解决问题付出一些努力。 以下是一些帮助您入门的代码:

s = s.replace('\\\n', '')
re.findall(r'VALUE="(.*?)\s*(?: " END=STRING|END=STRING)', s, re.M)

首先,您并没有真正整齐地提出问题。

但建议 1. 只是使用\S+而不是[a-zA-Z0-9/+._-]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM