我有一个看起来像
的字符串test = '20170125NBCNightlyNews'
我试图将它分成两部分,数字和名称。 格式将永远是[日期] [显示] 日期被剥离格式,并且仅在YYYYMMDD的方向上是数字(不要认为重要)
我正在尝试使用re
。我写了一个有效的版本。
re.split('(\d+)',test)
很简单,这给了我列表中需要的值。
['', '20170125', 'NBCNightlyNews']
但是,正如您将注意到的,第一个位置有一个空字符串。理论上我可以忽略它,但我想先了解它为什么存在,以及是否/如何避免它。
我也试过告诉它匹配字符串的开头,并得到相同的结果。
>>> re.split('(^\d+)',test)
['', '20170125', 'NBCNightlyNews']
>>> re.split('^(\d+)',test)
['', '20170125', 'NBCNightlyNews']
>>>
有没有人有任何输入,为什么这是/我如何避免空字符串?
答案 0 :(得分:3)
通过输入re.split('(^\d+)', test)
,您实际上在做的是,您的测试字符串会在出现至少一个字符的数字时被拆分。
所以,如果你有
test = '20170125NBCNightlyNews'
这种情况正在发生:
20170125 NBCNightlyNews
^^^^^^^^
该字符串分为三个部分,数字前面的所有内容,数字本身以及数字后的所有内容。
如果你有一个由空白字符分隔的单词句子,也许更容易理解。
re.split(' ', 'this is a house')
=> ['this', 'is', 'a', 'house']
re.split(' ', ' is a house')
=> ['', 'is', 'a', 'house']
答案 1 :(得分:3)
其他答案已经解释了为什么您正在做的事情做了什么,但如果您有一个日期的常量格式,则没有理由滥用re.split
来解析这些数据:
test[:8], test[8:]
将你的琴弦分开就好了。
答案 2 :(得分:2)
您在开头会得到一个空结果,因为您的输入字符串以数字开头,而您只是按数字分割。因此,你得到一个空字符串,它在第一组数字之前。
为避免您使用filter
:
>>> print filter(None, re.split('(\d+)',test))
['20170125', 'NBCNightlyNews']
答案 3 :(得分:2)
为什么re.split
可以匹配并获取群组?...
import re
test = '20170125NBCNightlyNews'
pattern = re.compile('(\d+)(\w+)')
result = re.match(pattern, test)
result.groups()[0] # for the date part
result.groups()[1] # for the show name
我意识到现在的意图是解析文本,而不是修复正则表达式的用法。我和其他人一样,当你已经知道格式不会改变并且日期是固定大小并且永远是第一个时,你不应该使用正则表达式完成这个简单的任务。只需使用字符串索引。
答案 4 :(得分:2)
如果分隔符中有捕获组并且它在字符串的开头匹配,则结果将以空字符串开头。对于字符串的结尾也是如此。这样,分隔符组件总是在结果列表中的相同相对索引处找到。
所以如果你有:
test = 'test20170125NBCNightlyNews'
索引不受影响:
>>>re.split('(\d+)',test)
['test', '20170125', 'NBCNightlyNews']
答案 5 :(得分:1)
如果日期总是8位数,我会直接访问子串(不使用正则表达式):
>>> [test[:8], test[8:]]
['20170125', 'NBCNightlyNews']
如果日期的长度可能有所不同,我会使用:
>>> s = re.search('^(\d*)(.*)$', test)
>>> [s.group(1), s.group(2)]
['20170125', 'NBCNightlyNews']