正则表达式匹配任何由字母、数字和撇号组成的字符串。但排除下划线

问题描述 投票:0回答:2

我正在拼命寻找Python中的正则表达式,仅使用

re
库。该表达式应将文本分成由任何语言的字母、数字和撇号组成的单个字符串。

例如:

  • "Test, this is a String 123!"
    应该是:
    ["Test", "this", "is", "a", "String", "123"]
  • "λάκιäsañ"
    应该是:
    ["λάκιäsañ"]
  • "not_underscores"
    应该是:
    ["not", "underscores"]

到目前为止我尝试过:

[\w\']+

这是一个类似

"included_Underscores"
的字符串,未分为
"included"
"underscores"

([^\W_]+(?:\')*)

这里是所有应该被识别的内容,但是

"'"
之后的字符被分开了

([\w\'](?<=[^_]))+

这里,单词的最后一个字符被分隔开

python expression python-re
2个回答
0
投票

怎么样

import re


def splitIt(line: str) -> list[str]:
    line = re.sub(r"[_]", " ", line)
    line = re.sub(r"[^\w']+$", "", line)
    line = re.sub(r"^[^\w']+", "", line)
    res = re.split(r"[^\w']+", line)
    return res


assert splitIt("Test, this is a String 123") == [
    "Test",
    "this",
    "is",
    "a",
    "String",
    "123",
]

assert splitIt("asdf λάκιäsañ 123") == [
    "asdf",
    "λάκιäsañ",
    "123",
]

assert splitIt("not_underscores") == [
    "not",
    "underscores",
]


assert splitIt("not' underscores") == [
    "not'",
    "underscores",
]


0
投票

\w
包含下划线。如果您想要不同的定义,则需要将其拼写出来。幸运的是,在这种情况下,很容易定义由任何非
\w
、非下划线字符或撇号组成的补语。

re.findall(r"(?:[^\W_]|')+", text)

演示:

>>> import re
>>> re.findall(r"(?:[^\W_]|')+", "Test, this is a String 123!")
['Test', 'this', 'is', 'a', 'String', '123']
>>> re.findall(r"(?:[^\W_]|')+", "λάκιäsañ")
['λάκιäsañ']
>>> re.findall(r"(?:[^\W_]|')+", "not_underscores")
['not', 'underscores']
>>> re.findall(r"(?:[^\W_]|')+", "don't worry, be happy")
["Don't", 'worry', 'be', 'happy']

一个明显的缺点是字符串周围的单引号也会被包含在内。

>>> re.findall(r"(?:[^\W_]|')+", "'scare quotes' are scary")
["'scare", "quotes'", 'are', 'scary']

有时它们也是单词的正确组成部分。

>>> re.findall(r"(?:[^\W_]|')+", "vi flytt' int'")
['vi', "flytt'", "int'"]
© www.soinside.com 2019 - 2024. All rights reserved.