簡體   English   中英

你如何使用re.split作為更多的“切片”函數進行拆分?

[英]How do you split using re.split as more of a “slice at” function?

你如何使用re.split作為更多的“切片”函數進行拆分?

我知道很多正則表達式函數,所以這不是問題。 問題在於,當使用split函數時,它會刪除它搜索的內容,除非它在一個組中,但這會導致它自己的問題。 我需要它在NAME,TAKE SEL或TAKE分開,但保留一切。

這是文字:

NAME "440 Sine Wave 5 seconds.wav"
VOLPAN 1.000000 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {857A4ED4-172A-43EE-AECF-CC4D027CE5D3}
<SOURCE WAVE
FILE "C:\Users\Greg\Desktop\test2\440 Sine Wave 5 seconds.wav"
>
SM 0.607738664073 0.6077386641 + 2.044211870063 2.0442118701 + 3.314938167670 3.3149381677 + 4.088423740126 4.0884237401
TAKE SEL
NAME "440 Sine Wave 5 seconds render 002.wav"
TAKEVOLPAN 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {DD233FDE-7641-4F02-AE9A-8B99FF400F24}
<SOURCE WAVE
FILE "C:\Users\Greg\Documents\REAPER Media\440 Sine Wave 5 seconds render 002.wav"
>
SM 0.899258786122 0.8992587861 + 1.268694185507 1.2686941855 + 1.709174854005 1.7091748540 + 2.050192145745 2.0501921457 + 2.718017675403 2.7180176754 + 3.307693409037 3.3076934090 + 3.762383131357 3.7623831314 + 4.131818530742 4.1318185307 + 4.458626768660 4.4586267687
TAKE
NAME "440 Sine Wave 5 seconds render 003.wav"
TAKEVOLPAN 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {A01A4793-7E2C-47EC-A22C-659A8FE0C162}
<SOURCE WAVE
FILE "C:\Users\Greg\Documents\REAPER Media\440 Sine Wave 5 seconds render 003.wav"
>
SM 0.679018451873 0.6790184519 + 2.874317267450 2.8743172675
>

這是分裂的方式

NAME "440 Sine Wave 5 seconds.wav"
VOLPAN 1.000000 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {857A4ED4-172A-43EE-AECF-CC4D027CE5D3}
<SOURCE WAVE
FILE "C:\Users\Greg\Desktop\test2\440 Sine Wave 5 seconds.wav"
>
SM 0.607738664073 0.6077386641 + 2.044211870063 2.0442118701 + 3.314938167670 3.3149381677 + 4.088423740126 4.0884237401

TAKE SEL
NAME "440 Sine Wave 5 seconds render 002.wav"
TAKEVOLPAN 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {DD233FDE-7641-4F02-AE9A-8B99FF400F24}
<SOURCE WAVE
FILE "C:\Users\Greg\Documents\REAPER Media\440 Sine Wave 5 seconds render 002.wav"
>
SM 0.899258786122 0.8992587861 + 1.268694185507 1.2686941855 + 1.709174854005 1.7091748540 + 2.050192145745 2.0501921457 + 2.718017675403 2.7180176754 + 3.307693409037 3.3076934090 + 3.762383131357 3.7623831314 + 4.131818530742 4.1318185307 + 4.458626768660 4.4586267687

TAKE
NAME "440 Sine Wave 5 seconds render 003.wav"
TAKEVOLPAN 0.000000 1.000000 -1.000000
SOFFS 0.00000000000000
PLAYRATE 1.00000000000000 1 0.00000000000000 -1 0 0.002500
CHANMODE 0
GUID {A01A4793-7E2C-47EC-A22C-659A8FE0C162}
<SOURCE WAVE
FILE "C:\Users\Greg\Documents\REAPER Media\440 Sine Wave 5 seconds render 003.wav"
>
SM 0.679018451873 0.6790184519 + 2.874317267450 2.8743172675
>

您可以使用前瞻在每個令牌之前執行拆分,但是您不能拆分零長度匹配,因此您必須匹配某些內容。 在這種情況下,看起來您應該只能在令牌之前拆分換行符。

至於執行此操作的正則表達式,根據您的示例,如果它不在TAKETAKE SEL ,您看起來只想在NAME上拆分,這使得它更復雜一些。 以下應該有效:

re.split(r'\n(?=TAKE(?: SEL)?\n|(?<!\nTAKE\n)(?<!\nTAKE SEL\n)NAME)', s)

所以這里的想法是,如果下一行是TAKETAKE SEL ,或者如果下一行以NAME開頭且前一行不是TAKETAKE SEL ,我們將匹配換行符。

例子:

>>> s = 'foo\nTAKE\nbar'   # split on TAKE
>>> re.split(r'\n(?=TAKE(?: SEL)?\n|(?<!\nTAKE\n)(?<!\nTAKE SEL\n)NAME)', s)
['foo', 'TAKE\nbar']
>>> s = 'foo\nTAKE SEL\nbar'   # split on TAKE SEL
>>> re.split(r'\n(?=TAKE(?: SEL)?\n|(?<!\nTAKE\n)(?<!\nTAKE SEL\n)NAME)', s)
['foo', 'TAKE SEL\nbar']
>>> s = 'foo\nTAKE SEL\nNAME\nbar'   # split on TAKE SEL but not on NAME
>>> re.split(r'\n(?=TAKE(?: SEL)?\n|(?<!\nTAKE\n)(?<!\nTAKE SEL\n)NAME)', s)
['foo', 'TAKE SEL\nNAME\nbar']
>>> s = 'foo\nNAME\nbar'   # split on NAME since no TAKE or TAKE SEL before
>>> re.split(r'\n(?=TAKE(?: SEL)?\n|(?<!\nTAKE\n)(?<!\nTAKE SEL\n)NAME)', s)
['foo', 'NAME\nbar']

暫無
暫無

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

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