在特定字符之间插入空格,但如果后面紧跟特定字符则不

时间:2018-10-18 20:51:30

标签: python regex

我希望使用python正则表达式在字母字符和数字之间插入一个空格(字母始终在数字前面),但不要在(数字和连字符)之间(在数字和下划线之间)插入一个空格。

理想情况下,我希望它替换行上的所有此类示例(请参见下面的第3个示例字符串),但是即使仅执行第一个示例也很棒。

我已经走了这么远:

import re
item = "Bob Ro1-1 Fred"
txt = re.sub(r"(.*)(\d)", r"\1 \2", item)
print(txt) #prints Bob Ro1 -1 Fred (DESIRED WOULD BE Bob Ro 1-1 Fred)

我曾尝试在各个地方粘贴?来使搜索不复杂,但还没有找到魔术。

  

示例字符串:Original ==> Desired output
  1.“ Bob Ro1 Sam cl3” ==>“ Bob Ro 1 Sam cl 3”
  2.“ Some Guy ro1-1 Sam” ==>“ Some Guy ro1-1 Sam”
  3.“ ribrib ribbit ro3_2 bob wow cl1-3” ==>“ ribbit ribbit ro 3_2 bow wow cl 1-3”

2 个答案:

答案 0 :(得分:3)

您可以使用

re.sub(r'([^\W\d_])(\d)', r'\1 \2', s)

请参见regex demo

使用环顾四周的variation

re.sub(r'(?<=[^\W\d_])(?=\d)', ' ', s)

([^\W\d_])(\d)正则表达式将任何单个字母匹配并捕获到组1中,并将下一个数字捕获到组2中。然后,\1 \2替换模式将第1组中的字母,空格和第2组中的数字插入到结果字符串中。

(?<=[^\W\d_])(?=\d)与字母和数字之间的位置匹配,因此替换字符串仅包含一个空格。

请参见Python demo

import re
strs = [ 'Bob Ro1-1 Fred', 'Bob Ro1 Sam cl3', 'Some Guy ro1-1 Sam', 'ribbet ribbit ro3_2 bob wow cl1-3' ]
rx = re.compile(r'([^\W\d_])(\d)')
for s in strs:
    print(re.sub(r'([^\W\d_])(\d)', r'\1 \2', s))
    print(re.sub(r'(?<=[^\W\d_])(?=\d)', ' ', s))

输出:

Bob Ro 1-1 Fred
Bob Ro 1-1 Fred
Bob Ro 1 Sam cl 3
Bob Ro 1 Sam cl 3
Some Guy ro 1-1 Sam
Some Guy ro 1-1 Sam
ribbet ribbit ro 3_2 bob wow cl 1-3
ribbet ribbit ro 3_2 bob wow cl 1-3

答案 1 :(得分:2)

您需要先看后面,再看后面:

select message, length(message) from surveys where regexp_like(message, '[a-zA-Z]+ [0-9]+')

代码应为(?<=[a-zA-Z])(?=[0-9])