首页 > 解决方案 > 正则表达式检查有多少字符被空白字符包围

问题描述

有字符串要被一个函数处理,整个过程是这样的:

surrounding_characters = ["\n", "\t", "\r"]
input_string = "\nT\t \tE\t\nS\n\rT\t"
_s = "".join(surrounding_characters)

pattern = re.compile(rf"([\s\S])(?<=[{_s}])(?=[{_s}])")

print(re.findall(pattern, input_string))
## ['\t', '\n']

我宁愿将其['T', ' ', 'E', 'S', 'T']视为输出,因为这些字符中的每一个都被空白字符包围。从模式中删除第一组并将其保留[\s\S]也不会改变方法的行为。

如何使其按预期工作?

标签: pythonpython-3.xregex

解决方案


[\s\S]在错误的地方使用。它应该放在lookbehind 和lookahead 断言之间:

>>> surrounding_characters = ["\n", "\t", "\r"]
>>> input_string = "\nT\t \tE\t\nS\n\rT\t"
>>> _s = "".join(surrounding_characters)
>>> pattern = re.compile(rf"(?<=[{_s}])[\s\S](?=[{_s}])")
>>> print (re.findall(pattern, input_string))
['T', ' ', 'E', 'S', 'T']

(?s)请注意,您也可以在此处使用单行修饰符.

>>> pattern = re.compile(rf"(?s)(?<=[{_s}]).(?=[{_s}])")

当您放置.[\s\S]处于后向和前瞻条件之间时,正则表达式引擎会在正确的位置应用这些条件。


推荐阅读