转换的正则表达式(不使用多个语句)

时间:2017-08-10 13:41:05

标签: python regex pandas

使用Regex将一个语句提取并转换为另一个语句的最佳方法是什么?

具体来说,我已经实现了以下内容,从文本块中查找并提取了一个序号,并将其转换如下: AB123CD AB-123-CD < / p>

现在,这实现为3个语句如下:

gg['student_num'] = gg['student_test'].str.extract('(\d{2})\w{3}\d{2}') + \
                    '-' + gg['student_num'].str.extract('\d{2}(\w{3})\d{2}') + \
                    '-' + gg['student_test'].str.extract('\d{2}\w{3}(\d{2})')

我觉得我不需要有三个陈述 -  每组一个 - 在下面连接在一起(如果更复杂的话,甚至更多)并且想知道是否有更好的方法来查找和转换某些文本?

2 个答案:

答案 0 :(得分:2)

您可以使用regexp获取细分列表,然后以这种方式加入:

'-'.join(re.search(r'(\d{2})(\w{3})(\d{2})', string).groups())

如果AttributeError不包含所需的模式(string返回re.search()),则可以获得None,因此您可能希望将此表达式包装在{{1}中阻止。

答案 1 :(得分:1)

这不是正则表达式,但它快速而简洁:

s = "AB123CD"

first = [i for i, a in enumerate(s) if a.isdigit()][0]
second = [i for i, a in enumerate(s) if a.isdigit()][-1]

new_form = s[:first]+"-"+s[first:second+1]+"-"+s[second+1:]

输出:

AB-123-CD

替代正则表达式解决方案:

letters = re.findall("[a-zA-Z]+", s)
numbers = re.findall("[0-9]+", s)
letters.insert(1, numbers[0])
final = '-'.join(letters)
print(final)

输出:

AB-123-CD
相关问题