我找不到合适的正则表达式:
print(re.compile(r'row_([0-9]+)(_[^_]+)*').split('row_0007_id_testa_testb'))
> ['', '0007', '_testb', '']
我试过非贪婪的正则表达式,也没有用过:
print(re.compile(r'row_([0-9]+)(_[^_]+)+?').split('row_0007_id_testa_testb'))
['', '0007', '_id', '_testa_testb']
我需要得到这个:
> ['', '0007', 'id', 'testa', 'testb']
答案 0 :(得分:1)
您可以在_([^_]+)
中使用简单的正则表达式findall
,并使用内联if条件断言该字符串以row_
开头:
>>> reg = re.compile(r'_([^_]+)')
>>> s = 'row_0007_id_testa_testb'
>>> print re.findall(reg, s) if s.startswith('row_') else None
['0007', 'id', 'testa', 'testb']
>>> s = 'col_0007_id_testa_testb'
>>> print re.findall(reg, s) if s.startswith('row_') else None
None
答案 1 :(得分:0)
假设您只想匹配包含字母和数字的字符串,但用空字符串替换第一个匹配项。如果是这样,请使用
A
loc n sum avg
150 2 29 14.5
250 2 25 12.5
400 1 15 15
输出:
re.compile(r'^[^\W_]+_+|[\W_]+').split('row_0007_id_testa_testb')
测试此代码here。
答案 2 :(得分:0)
也许尝试使用单个re.split
命令:
re.split(r"^row_|_", "row_0007_id_testa_testb)
更广义的替换:
re.split(r"^[a-z]+_|_", "row_0007_id_testa_testb")
这将消除第一个_
前面的第一个单词,然后拆分其余的单词。
这个问题不清楚,虽然如果想要在前面添加拆分字符串列表,这应该可行:
r = re.split(r"_", s)[1:]
r.insert(0,'')
答案 3 :(得分:0)
您没有表明主机编程语言,但我认为 它是Python。
如我所见,您想要在_
字符上拆分源文本,所以
只有_
应该是正则表达式的内容。
p = re.compile('_').split('row_0007_id_testa_testb')
在['row', '0007', 'id', 'testa', 'testb']
中提供集p
。
所以唯一要改变的是将起始元素设置为
空字符串。然后你可以打印p
数组,得到
预期的结果。
下面是示例脚本:
import re
p = re.compile('_').split('row_0007_id_testa_testb')
print p
p[0] = ''
print p
答案 4 :(得分:0)
您可以使用|
替换findall
,其匹配row_
并且不会捕获捕获组中的下划线([^_]+)
import re
print(re.findall(r"row_|([^_]+)", 'row_0007_id_testa_testb'))
那会给你:
['', '0007', 'id', 'testa', 'testb']