关于regex:使用re.split()时去掉开始和结束字符

Getting rid of beginning and ending characters when using re.split()

本问题已经有最佳答案,请猛点这里访问。

我试图理解re.split(),我想忽略逗号分隔符、句点和破折号。

我不理解的是为什么在结果的末尾得到一个空字符串。

我似乎不知道如何忽略说逗号。

这是我的测试代码:

1
2
3
4
sntc = 'this is a sentence total $5678 fees: expenses $123,345 why not -2345 hey.'

test = re.split('\D*', sntc)
print(test)

我得到以下输出:

1
['', '5678', '123', '345', '2345', '']

很明显,分裂的影响太大了。我可以通过使用不同的regex方法来处理这一问题,但我无法理解为什么''位于结果的两端。


比你琥珀色和觉醒。

以下是我实现的方法:

1
2
3
4
    whatup = sntce.replace(',', '')
#gets rid of thousands separators
testing = re.findall(r'[0-9,-.]+', whatup)
#gets rid of everything but the pos and neg numbers.

我想我不需要逗号。然后我把弦拨到数字上,然后离开。


我想你真的想要这个:

1
2
>>> re.findall('\d+', sntc)
['5678', '123', '345', '2345']

你的regex没有什么问题,结果可能是这样的:

1
2
>>> re.split('\D*', sntc)
['', '', '5', '6', '7', '8', '', '1', '2', '3', '', '3', '4', '5', '', '2', '3', '4', '5', '', '']

我认为你打算做的是:

1
2
>>> re.split('\D+', sntc)
['', '5678', '123', '345', '2345', '']

然而,这正是split所说的,它分割事物,即使它离开nothing。以CSVs或TAB分隔的xls文件为例。它是这样设计的。--即使逗号或制表符之间没有任何内容,仍然存在那些列——空白列。

这里的\D+commaTAB一样工作,它将充当列分隔符,不管前面有没有东西,它都表示后面有一个新的column。上一个\D+匹配的内容也是一样的,不管你有没有遵循它,它后面仍然表示一个新的column


re.split()对此明确表示:

If there are capturing groups in the separator and it matches at the
start of the string, the result will start with an empty string. The
same holds for the end of the string:

1
2
>>> re.split(r'(\W+)', '...words, words...')`
['', '...', 'words', ', ', 'words', '...', ''`

我想你最好在这里用re.findall(r'\D+', sntc)


因为split寻找与分隔符匹配的regex,而hey.与regex匹配,但也将2345与字符串的结尾分隔开。

所以你得到的是'2345 hey.'被分成'2345'''' hey.'介于两者之间。

类似地,如果你的分隔符是EDCOX1,6,你得到了字符串EDCOX1,7,你会得到EDCOX1的结果8,因为EDCOX1,6将中间的EDCOX1,10,10的字符串的开头和结尾分开。