在 python 中用新行、符号和带空格的正则表达式拆分字符串

Split string with regex by new lines, symbols and withspaces in python

我是正则表达式库的新手,我正在尝试使用这样的文本

"""constructor SquareGame new(){
let square=square;
}"""

这会输出一个列表:

['constructor', 'SquareGame', 'new', '(', ')', '{', '\n', 'let', 'square', '=',  'square', ';', '}']

我需要创建一个由空格、换行符和此符号分隔的标记列表 {}()[].;,+-*/&|<>=~

我使用了 re.findall('[,;.()={}]+|\S+|\n', text),但似乎只用空格和换行符来分隔标记。

您可以使用

re.findall(r'\w+|[^\w \t]', text)

为了避免匹配any Unicode horizo​​ntal whitespace 使用

re.findall(r'\w+|[^\w \t\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]', text)

regex demo详情:

  • \w+ - 1 个或多个单词字符
  • | - 或
  • [^\w \t] - 不是 space 的单个非单词字符和制表符字符(因此,匹配所有垂直白色 space)。

您可以添加更多水平白色space 字符以排除到 [^\w \t] 字符 class 中,请参阅 Match whitespace but not newlines 中的列表。正则表达式看起来像 \w+|[^\w \t\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000].

查看 Python demo:

import re
pattern = r"\w+|[^\w \t]"
text = "constructor SquareGame new(){\nlet square=square;\n}"
print ( re.findall(pattern, text) )
# => ['constructor', 'SquareGame', 'new', '(', ')', '{', '\n', 'let', 'square', '=', 'square', ';', '\n', '}']

此正则表达式只会根据您指定的字符进行匹配,我认为这是一种更安全的方法。

>>> re.findall(r"\w+|[{}()\[\].;,+\-*/&|<>=~\n]", text)
['constructor', 'SquareGame', 'new', '(', ')', '{', '\n', 'let', 'square', '=', 'square', ';', '\n', '}'