【问题标题】:RegEx check how many characters are surrounded by whitespace characters正则表达式检查有多少字符被空白字符包围
【发布时间】:2021-02-24 11:13:20
【问题描述】:

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

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] 也不会改变方法的行为。

如何让它按预期工作?

【问题讨论】:

  • 看,([\s\S])(?&lt;=[\r\t\n]) 表示任何等于 CR、LF 或 TAB 的字符。它只匹配这三个字符。

标签: python python-3.x regex


【解决方案1】:

您在错误的地方使用了[\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] 置于后向和前瞻条件之间时,正则表达式引擎会在正确的位置应用这些条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多