亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用正則表達式在 CSV 字符串中填充空格

使用正則表達式在 CSV 字符串中填充空格

繁花不似錦 2022-06-02 12:00:19
在 Python 中,我試圖用正則表達式在 CSV 字符串中填充數字。我當然可以使用 split()、format() 和 join() 來做到這一點,但我的限制是使用正則表達式。為什么以下re.sub僅對找到的匹配項 0、2、4、6、8 進行替換?它跳過了所有其他比賽。import re# trying to pad the single-digit numbers in a CSV with a single leading space# input '1,2,12,14' would produce output ' 1, 2,12,14' (notice leading spaces on single-digit numbers)s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'print(s)# first, add commas to front and end so that first and final numbers are captured by the regexs = ',' + s + ',' # the main regexs = re.sub(r',([0-9]{1}),', r', \1,', s)# lastly, strip the front and end commas we added before the regexs = s.strip(',')print(s)...上面產生以下輸入字符串和輸出字符串:0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35 0,1, 2,3, 4,5, 6,7, 8,9,28,29,30,31,32,33,34,35所以我只是對re.sub()這里表現的技術原因感到好奇。
查看完整描述

3 回答

?
慕森王

TA貢獻1777條經驗 獲得超3個贊

您會得到該結果,因為該模式,([0-9]),匹配逗號、單個數字、逗號。在此字符串中(您還添加了逗號),0,1,2,3,4,5,6,7,8,,它只能匹配,0,,然后,2,等等......

要使用單個前導空格填充單個數字,您可以簡化腳本,省略使用條帶和附加逗號,并使用正向前瞻模式代替。

注意使用量詞{1}可以省略。

,([0-9])(?=,)

正則表達式演示Python 演示

例如


import re

s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'

regex = r',([0-9])(?=,)'

s = re.sub(regex, r', \1', s)

print(s)

輸出


0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35

如果您還想支持僅填充單個數字,則可以在末尾匹配逗號或斷言字符串結尾處更新正向前瞻:


,([0-9])(?=,|$)

正則表達式演示


編輯


由于您還想附加和前置逗號并填充第一個數字,因此您可以將模式更新為(?:,|^)([0-9])(?=,|$)


import re


s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35'

s = ',' + s + ','

s = re.sub(r'(?:,|^)([0-9])(?=,|$)', r', \1', s)

s = s.strip(',')

print(s)

輸出


 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35



查看完整回答
反對 回復 2022-06-02
?
慕蓋茨4494581

TA貢獻1850條經驗 獲得超11個贊

這就是我結束的地方,合并了The fourth bird的正則表達式:


s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35,7'

print(s)

s = ',' + s + ',' 

regex = r',([0-9])(?=,|$)'

s = re.sub(regex, r', \1', s)

s = s.strip(',')

print(s)

...根據需要在下面給出輸入字符串和輸出字符串:


0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,35,7

 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,28,29,30,31,32,33,34,35, 7

這對我有用......感謝所有回復者!


查看完整回答
反對 回復 2022-06-02
?
當年話下

TA貢獻1890條經驗 獲得超9個贊

我相信您可以使用以下正則表達式來實現您想要做的事情:


r'(?<!\d)(\d)(?=,|$)'


負片看后面,不是一個數字:(?<!\d)


匹配組任何數字:(\d)


正向向前看逗號或行尾:(?=,|$)


https://regex101.com/r/UQtqHK/1


import re


s = '0,1,2,3,4,5,6,7,8,9,28,29,30,31,32,33,34,5'


print(s)


s = re.sub(r'(?<!\d)(\d)(?=,|$)', r' \1', s)

print(s)

那就是說你可能會更好地使用str.format()


https://docs.python.org/3.7/library/string.html#format-string-syntax


row_one = "1,2,3,4,5,6,7,8,9,10,11,12,13"

row_two = "1,2,3,4,9,10,11,12,13,5,6,7,8"

row_one_array = row_one.split(',')

row_two_array = row_two.split(',')

print(",".join(["{:>2}".format(x) for x in row_one_array]))

print(",".join(["{:>2}".format(x) for x in row_two_array]))

神奇的一點是:{:>2}


:= 開始學期(不知道這叫什么)


>= 右對齊


2= 字符寬度


查看完整回答
反對 回復 2022-06-02
  • 3 回答
  • 0 關注
  • 264 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號