python重新分割所有空格和标点符号,撇号除外

问题描述

我想用除撇号之外的所有空格和标点符号来分割字符串。最好仍然使用单引号作为分隔符,除非它是撇号。我也想保留分隔符。 示例字符串
words = """hello my name is 'joe.' what's your's"""

这是我到目前为止的重新模式splitted = re.split(r"[^'-\w]",words.lower()) 我尝试在 ^ 字符后抛出单引号,但它不起作用。

我想要的输出是这个。 splitted = [hello,my,name,is,joe,.,what's,your's]

解决方法

在拆分后简单地处理您的列表可能更简单,而不首先考虑它们:

>>> words = """hello my name is 'joe.' what's your's"""
>>> split_words = re.split(r"[,.!?]",words.lower())  # add punctuation you want to split on
>>> split_words
['hello','my','name','is',"'joe.'","what's","your's"]
>>> [word.strip("'") for word in split_words]
['hello','joe.',"your's"]
,

一种选择是利用环视在所需位置进行拆分,并使用捕获组来保留拆分中的内容。

拆分后,您可以从结果列表中删除空条目。

\s+|(?<=\s)'|'(?=\s)|(?<=\w)([,.!?])

模式匹配

  • \s+ 匹配 1 个或多个空白字符
  • |
  • (?<=\s)' 匹配以空格字符开头的 '
  • |
  • '(?=\s) 后跟空格字符时匹配 '
  • |
  • (?<=\w)([,.!?]) 捕获第 1 组中的 , . ! ? 之一,如果前面有单词字符

看到一个 regex demo 和一个 Python demo

示例

import re

pattern = r"\s+|(?<=\s)'|'(?=\s)|(?<=\w)([,.!?])"
words = """hello my name is 'joe.' what's your's"""
result = [s for s in re.split(pattern,words) if s]
print(result)

输出

['hello','joe','.',"your's"]
,

我喜欢正则表达式高尔夫!

words = """hello my name is 'joe.' what's your's"""
splitted = re.findall(r"\b(?:\w'\w|\w)+\b",words)

括号中的部分是一个匹配被字母包围的撇号或单个字母的组。

编辑:

这更灵活:

re.findall(r"\b(?:(?<=\w)'(?=\w)|\w)+\b",words)

虽然此时有点难以理解,但实际上您应该使用伍德福德的答案。