【问题标题】:Extract data between patterns in python [duplicate]在python中的模式之间提取数据[重复]
【发布时间】:2021-08-24 18:07:06
【问题描述】:

考虑到我有以下字符串,

~m~90~m~{Somestringof length 90}~m~20~m~{Some string of len 20}~m~10~m~{Somestringof length 10}

需要将模式~m~\d~m~之间的字符串一一提取

我找到的一个解决方案类似于

my_pattern = re.compile("~m~\d+~m~")
data_arr = my_pattern.finditer(result)
if data_arr:
   get the indexes of pattern and search in original string

这个解决方案不是最优的,我相信一定有更好的方法来做到这一点。

【问题讨论】:

  • @anubhava,这样做会打印模式本身而不是中间的字符串
  • @JvdV 让我试试,ti7 的答案中给出了类似的解决方案
  • re.split(pattern, text) 可以。

标签: python regex


【解决方案1】:

您可以在~m~ 上拆分,这将得到数字和字符串!

>>> "~m~90~m~{Somestringof length 90}~m~20~m~{Some string of len 20}~m~10~m~{Somestringof length 10}".split("~m~")
['', '90', '{Somestringof length 90}', '20', '{Some string of len 20}', '10', '{Somestringof length 10}']

如果您确定您将始终拥有相同的表单,您可以清理它并使用 Pairs from single list(注意 itertools.izip 在 Python3 中只是 zip

>>> src_text = "~m~90~m~{Somestringof length 90}~m~20~m~{Some string of len 20}~m~10~m~{Somestringof length 10}"
>>> def pairwise(t):
...     it = iter(t)
...     return zip(it,it)
...
>>> for textlen, text in pairwise(filter(None, src_text.split("~m~"))):
...   print(f"{textlen}: {text}")
...
90: {Somestringof length 90}
20: {Some string of len 20}
10: {Somestringof length 10}

注意.split()-ing的结果将是字符串,所以如果需要的话,应该将数字长度显式转换为int()

【讨论】:

  • 哇,这似乎符合预期。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多