【问题标题】:Python split by exact substring?Python被精确的子字符串分割?
【发布时间】:2020-10-27 16:49:55
【问题描述】:

我想获取一个降价文档并按标题拆分它。首先是 h1,然后是 h2,然后是 h3。

所以对于第一个拆分,我需要用符号 # 拆分,但前提是它是完全隔离的,所以 ##### 都不应该被视为分隔符。如果我编写自己的方法,这是可行的,但这会增加我希望尽可能避免的冗长。

我尝试使用单词边界和正则表达式,但单词边界不计入 # 等符号

例如:

# Tests
Located at `Tests/`

## `main.cpp`
### `int AddOne(int num)`

 * **Param:** `num` Satisfies $\text{num} \in [-\infty,\infty]$.
### `int AddOne(int num)`

 * **Param:** `num` Satisfies $\text{num} \in [-\infty,\infty]$.
### `int AddOne(int num)`

 * **Param:** `num` Satisfies $\text{num} \in [-\infty,\infty]$.

首先应该将其拆分为一个包含空字符串的数组和一个包含文档其余部分的数组。

然后将非空部分拆分为一个数组,其中包含顶部和main.cpp 之后的所有内容。

最后,前一个数组的最后一个元素被分成 3 个不同的部分。 然后进入一个

用标准方法可以做到吗?

【问题讨论】:

  • 正则表达式是更好的工具。你试过吗?
  • 是的,编辑了问题,字边界不适用于特殊字符

标签: python string parsing


【解决方案1】:

您可以使用regular expressions 和否定的前瞻/后瞻断言:

import re

re.split(r"(?<!#)#(?!#)", "abc#def##ghi###jkl")
# ['abc', 'def##ghi###jkl']

re.split(r"(?<!#)##(?!#)", "abc#def##ghi###jkl")
# ['abc#def', 'ghi###jkl']

【讨论】:

  • 因为搜索是从左到右进行的,所以不需要向后看。
  • @KarlKnechtel 我检查了它,两者都是必需的。两个# 中的第一个将在没有后视的情况下进行匹配,而最后一个将在没有前瞻的情况下进行匹配。
  • 啊,有道理。
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多