Python使用re.split按多分隔符分割字符串报nothing to repeat错误
报错原因
- 你传入的正则模式存在语法错误,根源是没有区分正则元字符和普通字符:
?是正则内置的量词,作用是标记它前面的子表达式可匹配0次或1次,你直接将?写在模式的起始位置(位置0),它前面没有任何可作用的子表达式,正则解析器找不到要重复的匹配目标,直接抛出re.error: nothing to repeat at position 0异常。.是正则内置的通配符,默认匹配除换行符外的任意单个字符,不会匹配你预期的普通英文句号。
- 你先后尝试的
"?|."、"? |. "两个模式都没有对上述特殊元字符做转义,解析器会将其识别为正则语法符号,而非你要匹配的问号、句号字面量。
正确实现方法
正则中要匹配有特殊含义的元字符本身,需要在字符前加反斜杠\做转义;多分隔符匹配可以用|分隔不同的匹配规则,也可以用字符组[]简化写法。
基础写法
仅按问号、句号拆分字符串:
import re test_str = "How are you? I am talking to you. There?" # 转义后匹配?或.字面量 res = re.split(r"\?|\.", test_str) print(res) # 输出:['How are you', ' I am talking to you', ' There', '']
用字符组可以简化写法,字符组内的?、.会失去特殊元字符含义,不需要额外转义:
res = re.split(r"[?.]", test_str)
优化写法(去除空值、前后空格)
如果不想要拆分结果里的空字符串、片段前导空格,可以把分隔符连带后面的空白字符一起匹配,最后过滤空值:
import re test_str = "How are you? I am talking to you. There?" # 匹配?/. + 后面任意数量的空白字符 res = [seg.strip() for seg in re.split(r"[?.]\s*", test_str) if seg] print(res) # 输出:['How are you', 'I am talking to you', 'There']
如果需要新增分隔符(比如感叹号、逗号),直接在字符组里追加即可,例如同时按? . ! ,拆分:
re.split(r"[?!.,]\s*", test_str)
内容的提问来源于stack exchange,提问作者garg10may
相关产品推荐
相关产品推荐

