python - 正则表达式检查有多少字符被空白字符包围
问题描述
有字符串要被一个函数处理,整个过程是这样的:
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]
在错误的地方使用。它应该放在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]
处于后向和前瞻条件之间时,正则表达式引擎会在正确的位置应用这些条件。
推荐阅读
- javascript - SVG 不会在 Chrome/Brave 中渲染,但在 Edge 中可以正常工作
- docker - 我可以在同一目录中有多个 docker compose yaml 文件吗?
- python - 使用 python/pandas 从特定文件夹中读取几个嵌套的 .json 文件到 excel 中
- java - 无法在 Maven 中使用 @Stateless 注释
- javascript - 如何防止按钮重复提交
- javascript - 今天 angular 在 localhost 刷新后打开调试器,为什么?
- javascript - 如何在 React 中使用日期选择器?
- tsql - 如何在实体框架核心中转换外部应用
- r - 使用日期时间和数字列删除重复项
- python - 在 Python 中从两个 dna fasta 文件中创建散点图