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