簡體   English   中英

Python 帶有拆分字符和轉義字符的拆分字符串

[英]Python split string with split character and escape character

在 python 中,如何通過以下規則集使用正則表達式拆分字符串:

  1. 由拆分字符拆分(例如;
  2. 如果該拆分字符被轉義字符(例如: )轉義,則不要拆分。
  3. 如果轉義字符自行轉義,請進行拆分

所以分裂

"foo;bar:;baz::;one:two;::three::::;four;;five:::;six;:seven;::eight"

應該產生

["foo", "bar:;baz::", "one:two", "::three::::", "four", "", "five:::;six", ":seven", "::eight"]

我自己的嘗試是:

re.split(r'(?<!:);', str)

哪個不能處理規則#3

如果匹配也是一個選項,並且空匹配''不是必需的:

(?::[:;]|[^;\n])+
  • (?:非捕獲組
    • :[:;]匹配:后跟:;
    • | 或者
    • [^;\n]匹配除;以外的任何字符 1 次以上或換行符
  • )+關閉非捕獲組並重復 1+ 次

正則表達式演示

import re

regex = r"(?::[:;]|[^;\n])+"
str = "foo;bar:;baz::;one:two;::three::::;four;;five:::;six;:seven;::eight"
print(re.findall(regex, str))

Output

['foo', 'bar:;baz::', 'one:two', '::three::::', 'four', 'five:::;six', ':seven', '::eight']

Python 演示

如果您想要空匹配,您可以添加 2 個環視來獲得 position 有一個; 向左和向右

(?::[:;]|[^;\n]|(?<=;)(?=;))+

正則表達式演示

您可以使用具有以下模式的regex模塊進行拆分:

(?<!:)(?:::)*\K;

查看在線演示

  • (?<::) - 消極的后視。
  • (?:::)* - 0+ 乘以 2 個文字冒號的非捕獲組。
  • \K - 重置報告匹配的起點。
  • ; - 文字分號。

例如:

import regex as re
s = 'foo;bar:;baz::;one:two;::three::::;four;;five:::;six;:seven;::eight'
lst = re.split(r'(?<!:)(?:::)*\K;', s)
print(lst) # ['foo', 'bar:;baz::', 'one:two', '::three::::', 'four', '', 'five:::;six', ':seven', '::eight']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM