Python正则表达式替换到特定字符

2024-06-29 01:14:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望用逗号替换空格,但直到第一次/为止,我尝试了以下方法:

import re

txt = "usera   28935 28876  0 Apr25 ?        00:07:20 /xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx -cp /xxx/yyyy/foo/bar/zzzzz"

rem = (re.sub(' +', ' ', txt))  # convert multiple spaces into single

print(re.sub(' ', ',', rem.lstrip()))

但是输出是-在每个空格后插入逗号

usera,28935,28876,0,Apr25,?,00:07:20,/xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx,-cp,/xxx/yyyy/foo/bar/zzzzz

预期产出:

usera,28935,28876,0,Apr25,?,00:07:20,/xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx -cp /xxx/yyyy/foo/bar/zzzzz

也就是说,逗号应该一直应用到第一个/

我试过向前看,向后看,但无法解决这个问题。 有人能告诉我如何做到这一点吗


Tags: retxtfoobarjavacpxxx空格
2条回答

您可以使用lookback,但它必须是可变长度的。因此,您需要第三方regex模块:

>>> import regex
>>> txt = "usera   28935 28876  0 Apr25 ?        00:07:20 /xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx -cp /xxx/yyyy/foo/bar/zzzzz"
>>> regex.sub(r'(?<!/.*) +', ',', txt)
'usera,28935,28876,0,Apr25,?,00:07:20,/xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx -cp /xxx/yyyy/foo/bar/zzzzz'

# or you can use \G
>>> regex.sub(r'\G([^/ ]*+) +', r'\1,', txt)
'usera,28935,28876,0,Apr25,?,00:07:20,/xxx/yyyy/foo/bar/zzzzz/Java/jdk-1.8.0_101/xxx/xxx -cp /xxx/yyyy/foo/bar/zzzzz'

只有当/字符在字符串的前面不存在时,第一个字符才替换空格

第二个定义了一个非空格或/字符序列,后跟空格,以便从字符串开始尽可能多地匹配

每当你遇到这样的问题,在使用正则表达式

之前考虑拆分。
# split the text once at the first /
a, b = txt.split("/", 1)

# do the replacement in the first half
a = re.sub(" +", ",", a)

# join 'em back up
result = "{}/{}".format(a,b)

相关问题 更多 >