如何用正则匹配字符串首尾最多20字符的单词组并消除多余空格?
正则匹配解决方案
问题原因
原正则里的.{0,20}会包含空格,而\b匹配的是空格与单词之间的边界,导致匹配结果带上了末尾/前置空格。
开头匹配(无末尾空格)
使用以下正则,既能控制匹配内容总长度不超过20字符,又能保证结果不带末尾空格:
import re s1 = "Hello, World! This is a reallly long string" match = re.search(r"^(.{0,19}\S)(?=\s|$)", s1) print(f"'{match.group(0)}'") # 输出: 'Hello, World! This'
解释:
^锚定字符串开头.{0,19}\S确保最后一个字符是非空白字符,总长度最多20(19个任意字符+1个非空白字符)(?=\s|$)正向预查,保证匹配内容后面是空格或字符串结尾,确保匹配到完整单词且不带尾随空格
如果需要更严格的长度控制,也可以用带正向预查的版本:
match = re.search(r"^(?=.{0,20}$)\S.*?(?=\s|$)", s1)
解释:
(?=.{0,20}$)强制匹配内容长度在0-20字符之间\S避免匹配开头的空白字符.*?非贪婪匹配,直到遇到空格或字符串结尾
结尾匹配(无前置空格)
针对字符串末尾的匹配,用以下正则去除前置空格:
match = re.search(r"(?<=^|\s)(.{0,19}\S)$", s1) print(f"'{match.group(0)}'") # 输出: 'reallly long string'
解释:
(?<=^|\s)反向预查,确保匹配内容前面是空格或字符串开头,排除前置空格.{0,19}\S保证最后一个字符是非空白,总长度不超过20$锚定字符串结尾
同样,带严格长度控制的版本:
match = re.search(r"(?<=^|\s)(?=.{0,20}$).*?(?<!\s)$", s1)
解释:
(?=.{0,20}$)控制匹配内容长度≤20.*?(?<!\s)$确保匹配内容结尾不是空白字符
内容的提问来源于stack exchange,提问作者NOT
相关产品推荐
相关产品推荐

