python在所有空格和标点处重新拆分,撇号除外

python在所有空格和标点处重新拆分,撇号除外,python,string,split,re,apostrophe,Python,String,Split,Re,Apostrophe,我想用所有空格和标点符号分割字符串,撇号除外。最好是单引号仍然用作分隔符,除非它是撇号。我还想保留delimeters。 示例字符串 words=“”你好,我的名字是‘乔’。你的名字是什么?“ 这是我迄今为止的re模式splited=re.split(r“[^'-\w]”,words.lower()) 我尝试在“^字符后添加一个引号,但它不起作用 我想要的输出是这个splitted=[你好,我的名字是,joe,what's,your's]我喜欢regex高尔夫 words=”““你好,我叫‘乔’

我想用所有空格和标点符号分割字符串,撇号除外。最好是单引号仍然用作分隔符,除非它是撇号。我还想保留delimeters。 示例字符串
words=“”你好,我的名字是‘乔’。你的名字是什么?“

这是我迄今为止的re模式
splited=re.split(r“[^'-\w]”,words.lower())
我尝试在“^字符后添加一个引号,但它不起作用

我想要的输出是这个
splitted=[你好,我的名字是,joe,what's,your's]

我喜欢regex高尔夫

words=”““你好,我叫‘乔’。你的名字是什么?”
splitted=re.findall(r“\b(?:\w'\w |\w)+\b”,字)
括号中的部分是一个组,它匹配由字母包围的撇号或单个字母

编辑:

这是更灵活的:


re.findall(r”\b(?:(?在拆分后只处理列表而不首先考虑它们可能更简单:

words=“”你好,我的名字是‘乔’。你的名字是什么 >>>split_words=re.split(r“[,.!?]”,words.lower())#添加要拆分的标点符号 >>>分裂词 [‘你好’、‘我的’、‘名字’、‘是’、‘乔’、‘是什么’、‘你的’] >>>[word.strip(“”)表示拆分单词中的单词] [“你好”、“我的”、“名字”、“是”、“乔”、“什么”、“你的”]
一个选项是使用lookarounds在所需位置拆分,并使用要保留在拆分中的捕获组

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

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

['hello', 'my', 'name', 'is', 'joe', '.', "what's", "your's"]

连字符表示字符类中的范围(例如
a-z
),因此您需要对其进行转义
[^'\-\w]
,或者将其放在末尾
[^'\w-]
。不能完全处理双收缩的情况:):
words=“这根本不起作用“
很抱歉,我忘了添加一个问题,我也想保留delimeters。有什么方法可以这样做吗?我不知道你所说的“保留delimeters”是什么意思保留delimeters我的意思是我想保留字符串中用于拆分的部分。因此”“嗨,我的名字是joe!”“将等于[“嗨”,“我的”,“我的名字”,“是”“joe”和“joe”!“所以你想保留除空格以外的所有内容。不要认为你可以用一个正则表达式来完成。你只需在空格上拆分(
re.split(r”\s+”,words)
)然后处理结果。很抱歉,我忘了在问题中添加我也想保留delimeters。有什么方法可以做到这一点吗?
['hello', 'my', 'name', 'is', 'joe', '.', "what's", "your's"]