插入空格以分隔相连的字母和数字字符串-Python RegEx

时间:2018-11-30 17:11:22

标签: python regex

在Python中,我需要创建一个正则表达式,在任何串联的AlphaNum组合之间插入一个空格。例如,这就是我想要的:

8min15sec ==> 8 min 15 sec
7m12s ==> 7 m 12 s
15mi25s ==> 15 mi 25 s

RegEx101 demo

我对在线找到的解决方案感到困惑,但是这些解决方案对于我来说太复杂了,无法解析/修改。例如,我有这个:

[a-zA-Z][a-zA-Z\d]*

但它仅标识第一个插入点:8Xmin15sec(X)

还有这个

(?<=[a-z])(?=[A-Z0-9])|(?<=[0-9])(?=[A-Z])

但它只能找到这一点:8分钟X 15秒(X)

我肯定可以使用具有完整语法的指针来找到每个插入点并插入空格。

RegEx101 demo(与上面相同的链接)

3 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式来标记点,该点是数字和字母的边界,其顺序为数字先于字母,字母反之亦然。

(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)

此正则表达式(?<=\d)(?=[a-zA-Z])标记了一个点,该点的正向查找字母为正,正向向后查找字母为数字。

类似地,(?<=[a-zA-Z])(?=\d)执行相同的操作,但顺序相反。

然后用空格替换该标记。

Demo

这是相同的示例python代码。

import re
arr = ['8min15sec', '7m12s', '15mi25s']
for s in arr:
 print (s + ' --> ' + re.sub('(?<=\d)(?=[a-zA-Z])|(?<=[a-zA-Z])(?=\d)', ' ',s))

输出以下输出,

8min15sec --> 8 min 15 sec
7m12s --> 7 m 12 s
15mi25s --> 15 mi 25 s

答案 1 :(得分:2)

以下方法如何?

var n = [9, -2, 5, 6, 3, 4, 0];

int minN = n[0];
int maxN = n[0];
n.skip(1).forEach((b) {
  minN = minN.compareTo(b) >= 0 ? b : minN;
  maxN = maxN.compareTo(b) >= 0 ? maxN : b;

});
print('Max: $maxN');  // Max: 9
print('Min: $minN');  // Min: -2

哪个会给你:

import re

for test in ['8min15sec', '7m12s', '15mi25s']:
    print(re.sub(r'(\d+|\D+)', r'\1 ', test).strip())  

答案 2 :(得分:1)

怎么样:

"(\d+)([a-zA-Z]+)"

"\1 \2 "

https://regex101.com/r/yvqCtQ/2

在python中:

In [59]: re.sub(r'(\d+)([a-zA-Z]+)', r'\1 \2 ',  '8min15sec')
Out[59]: '8 min 15 sec '