正则表达式获取一组文本

时间:2018-05-24 16:44:34

标签: regex

我找不到合适的正则表达式:

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']

5 个答案:

答案 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_并且不会捕获捕获组中的下划线([^_]+)

row_|([^_]+)

import re
print(re.findall(r"row_|([^_]+)", 'row_0007_id_testa_testb'))

那会给你:

['', '0007', 'id', 'testa', 'testb']

Demo