簡體   English   中英

如何將字符添加到正則表達式匹配字符串的開頭?

[英]How to add character to beginning of regex matched string?

我有一些我正在嘗試對齊的數據(如下)。

| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

似乎每當每行的倒數第三個值為負時,該行就缺少“|” 分隔符。 我正在嘗試使用正則表達式在記錄中間添加一個垂直條以重新對齊數據,如下所示:

| 24 | 11 |      | 506 | -1     | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99 | 3|
| 12 | 11 | 1933 | 531 | 2      | 7.78   | N|

忽略空格,我包含它是為了使數據更具可讀性,以便解決這個問題。

我知道下面的表達式會找到正確的文本組並放置一個額外的“|” 在它之后,但可以修改它以放置“|” 組前?

re.sub(r'(\|*\|*\|\|)', r'\1',DATA)

剛剛開始使用正則表達式,因此感謝您的任何幫助!

PS - 我正在使用 python 為這個數據處理任務做實際的正則表達式替換/添加。

您的正則表達式存在一些問題。 星號*表示前一個元素(無論是一個字符還是復合詞)可以重復零次或多次。 因此, \\|*將匹配 ""(空字符串)、"|"、"||" 等和\\|*\\|*\\|\\| 將匹配兩個連續的條“||” 前面有任意數量的柱線(0 個或更多)——因此,它只匹配最后兩個柱線。

為了證明這一點,使用re.sub ,您可以用一些不同的字符包圍反向引用(即\\1 )(我在下面使用了花括號,即{\\1} )。

data="""| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|
"""
print("using regex above, with curly braces around captured match:")
print(re.sub(r'(\|*\|*\|\|)', r'{\1}', data))

print("desired output:")
print(re.sub(r'(\|[^|]+\|[^|]+\|[^|]+\|\|)', r'|\1', data))

輸出:

using regex above, with curly braces around captured match:
| 24 | 11 | 506  | -1  | -829.99{||}
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

desired output:
| 24 | 11 || 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

該解決方案查找其間具有正數項的條,這些條不是條。 [^|]表示除|任何內容會匹配。 請注意,在括號中,該欄不需要轉義。 +表示“一個或多個前一個元素”。

這對你有用嗎? 它給了我想要的輸出。

re.sub(r'(\|.*\|.*\|.*)(\|.*\|.*\|\|\n)',r'\g<1>'+'|'+r'\g<2>',DATA)

我將 506 之前的所有內容保留在第 1 組中,並將其后的所有內容保留在第 2 組中,並添加了“|” 之間。

暫無
暫無

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

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