如果单词没有任何数字,则将字符串分开



我想将字符串分为白色空间或任何特殊字符上的单词。但是,如果拆分之前和之后的单词包含一个数字,而不是一个白空间字符,那么我不希望它分开。

" ABC ABC-DEF A2B-DEF A2B-D3F"

应该变成 - (请注意最后一句话(

" abc","," ABC"," - "," DEF","," A2B"," - "," DEF","," A2B-D3F"

我尝试了

b = "abc abc-def a2b-def a2b-d3f ab2-3cd"
print(re.split(r"((?<=D)[W]|[W](?=D)|s)",b))
print(re.split(r"((?<!bw*dw*b)[W]|[W](?!bw*dw*b)|s)",b))

第一个作品,但它仅考虑上一个或下一个单词的最后一个和第一个字符。它将" AB2-3CD"保持为一个单词,但对" A2B-C3D"不起作用。

第二个给我一个错误" look-behind需要固定宽度模式",因为它不允许我在look-back或look-head中使用 *。

请帮助我!

编辑:单词可以任意长度," abcdef"。

您可以从匹配模式 r'dw*W+w*d'

的单词中获取与ptrn r'w+|W+'相匹配的所有模式
>>> import re
>>> txt = "abc abc-def a2b-def a2b-d3f"
>>> [w for s in txt.split() for w in ([s] if re.search(r'dw*W+w*d', s) else re.findall(r'w+|W+', s)) + [' ']]
['abc', ' ', 'abc', '-', 'def', ' ', 'a2b', '-', 'def', ' ', 'a2b-d3f', ' ']
import re
s = "abc abc-def a2b-def a2b-d3f"
s = re.split(r'(?:(?<=[da-z]{3})(s|-)(?=[a-z]{3})|(?:(?<=[a-z]{3})(s|-)(?=[a-zd]{3})))', s)
s = [i for i in s if i is not None]
print(s)

打印:

['abc', ' ', 'abc', '-', 'def', ' ', 'a2b', '-', 'def', ' ', 'a2b-d3f']

编辑:

导入re

s = "a2dc abc axx2b-dss3f abc-def a2b-abc a2b-d3f"
s = re.split(r'(s|-)(?=[a-z]+(?:-|s))', s)
out = []
for w in s:
    out.extend(re.split(r'(?<=[a-zd])(s)(?=[a-zd])', w))
print(out)

打印:

['a2dc', ' ', 'abc', ' ', 'axx2b-dss3f', ' ', 'abc', '-', 'def', ' ', 'a2b', '-', 'abc', ' ', 'a2b-d3f']

最新更新