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

2024-09-27 07:32:56 发布

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

我想用所有空格和标点符号分割字符串,撇号除外。最好是单引号仍然用作分隔符,除非它是撇号。我还想保留delimeters。 示例字符串
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]


Tags: 字符串namehelloyourismywhatwords
3条回答

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

>>> 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', 'my', 'name', 'is', 'joe.', "what's", "your's"]

一种选择是使用lookarounds在所需位置进行拆分,并使用要保留在拆分中的捕获组

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

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

模式匹配

  • \s+匹配一个或多个空白字符
  • |
  • (?<=\s)'匹配'前面有空格字符
  • |
  • '(?=\s)匹配'后接空格字符
  • |
  • (?<=\w)([,.!?])捕获组1中的{}{}{}{}中的一个,前面有一个单词字符

见aregex demo和aPython 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', 'my', 'name', 'is', 'joe', '.', "what's", "your's"]

我喜欢regex高尔夫

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)

不过,在这一点上,它变得有点难以理解,实际上,你可能应该使用伍德福德的答案

相关问题 更多 >

    热门问题