簡體   English   中英

Python正則表達式拆分逗號或空格分隔的字符串

[英]Python regex split comma or space separated string

我已經顯示了我需要的輸入字符串和輸出字符串的示例。 數字和字符串可以是任意順序,並且它們可以具有任何數字或任何字符串(例如“ THIS”可以是其他字符串)

我需要以下輸出

["'5'", "'THIS'", "'/,'", "'4.2560'", "'0.34000E-01'"]

對於以下所有輸入字符串:

""" 5,'THISMORETHAN4','/,',4.2560,0.34000E-01 """
""" 5,'THIS','/,',4.2560,0.34000E-01 """
"""5 , 'THIS' , '/,' , 4.2560 , 0.34000E-01 """
""" '5'  'THIS' '/,' '4.2560' '0.34000E-01' """
""" 5,'THIS','this','/,',4.2560,0.34000E-01 """
""" 5,'THIS','/,',4.2560,0.34000E-01 """

這是先前問題的延續。

  1. 字符串可以以逗號分隔或以空格分隔。 逗號前后可能有空格,也可能沒有。
  2. 單引號中的子字符串中可能包含特殊字符(例如,“ /”,如上所示)

作為上一個問題的Padraic Cunningham解決方案的改進版本,正則表達式(["']).*?\\1(?<!\\\\["'])|[^\\r\\n\\t\\f ,]+將捕獲您的所有字段。

第一部分( (["']).*?\\1(?<!\\\\["']) ))現在也可以與'asdf"''asdf"'字段一起使用,因為環繞引號必須相同。使用轉義引號,因為(?<!\\\\["'])斷言第二個引號之前沒有反斜杠。

如果第一部分不匹配(即,引號中沒有字符串),則第二部分( [^\\r\\n\\t\\f ,]+ )匹配所有非空格或逗號。 因此它將忽略您的分隔符,但會匹配其他所有內容。

import re

rows = [""" 5,'THISMORE"THAN4','/,',4.2560,0.34000E-01 """,
        #              ^ added quote character here
        """ 5,'TH\\'IS','/,',4.2560,0.34000E-01 """,
        #          ^ added escaped quote here
        """5 , 'THIS' , '/,' , 4.2560 , 0.34000E-01 """,
        """ '5'  'THIS' '/,' '4.2560' '0.34000E-01' """,
        """ 5,'THIS','this','/,',4.2560,0.34000E-01 """,
        """ 5,'THIS','/,',4.2560,0.34000E-01 """]

pattern = re.compile(r'(["\']).*?\1(?<!\\["\'])|[^\r\n\t\f ,]+')

result = [[m.group(0).strip('"\'') for m in pattern.finditer(row)]
          for row in rows]

import pprint
pprint.pprint(result)

印刷品:

[['5', 'THISMORE"THAN4', '/,', '4.2560', '0.34000E-01'],
 ['5', "TH\\'IS", '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', 'this', '/,', '4.2560', '0.34000E-01'],
 ['5', 'THIS', '/,', '4.2560', '0.34000E-01']]

仍然有問題的是在引號中包含逗號分隔行中的空格的字段。 因此

'hello there, "I actually", have, 5, fields'

將導致:

['hello','there','I actually','have','5','fields']

您的數據中有嗎?

此正則表達式適用於所有測試用例

(\d)\W*\'([A-Z]{0,4})\w*\'.*(\/)\W*(\d*\.\d*)\W*(\d*\.\d*E-\d*)

暫無
暫無

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

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