为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Python 中的多行字符串中提取某些子字符串?

如何从 Python 中的多行字符串中提取某些子字符串?

哈士奇WWW 2022-06-28 10:15:43
我有一个如下所示的字符串answer = """models sold in last 4 weeks+---------------+|      pcid     |+---------------+|     22bv03    ||     3eer3d    ||  fes44h2j555j || 4mee33ikj5sq1 ||  99dkk3bvr32a || cv44trmq011sa ||    lo33xc1a   |+---------------+***For more information, please visit the company page."""现在我只需table要从字符串中提取,最终结果看起来像+---------------+|      pcid     |+---------------+|     22bv03    ||     3eer3d    ||  fes44h2j555j || 4mee33ikj5sq1 ||  99dkk3bvr32a || cv44trmq011sa ||    lo33xc1a   |+---------------+现在我尝试做这样的事情answer.split("***")[0].split("\n")[1]但是这样做,我只会得到与预期相反的标题table。如何确保我只能table从字符串中提取?有什么regex可以在这里应用的吗?
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我可能会尝试:


answer = re.sub(r'^.*?(?=\+-)|\*\*\*.*$', '', answer, flags=re.DOTALL)

print(answer)

这打印:


+---------------+

|      pcid     |

+---------------+

|     22bv03    |

|     3eer3d    |

|  fes44h2j555j |

| 4mee33ikj5sq1 |

|  99dkk3bvr32a |

| cv44trmq011sa |

|    lo33xc1a   |

+---------------+

正则表达式使用交替来处理在开头和结尾处修剪答案字符串。第一的:


^.*?(?=\+-)

删除从字符串开头到表格开头(但不包括)的所有内容+-。第二部分:


\*\*\*.*$

删除从脚注 ( ***) 开始到字符串结尾的所有内容。


查看完整回答
反对 回复 2022-06-28
?
白衣非少年

TA贡献1155条经验 获得超0个赞

看起来您想从第一次出现的固定分隔符到最后一次出现的相同分隔符进行匹配。


在这种情况下,您不必使用正则表达式:


sep = '+---------------+'

start = answer.find(sep)

end = answer.rfind(sep)

print(answer[start:end+len(sep)])

查看Python演示


+---------------+

|      pcid     |

+---------------+

|     22bv03    |

|     3eer3d    |

|  fes44h2j555j |

| 4mee33ikj5sq1 |

|  99dkk3bvr32a |

| cv44trmq011sa |

|    lo33xc1a   |

+---------------+

使用正则表达式,您可以直接匹配从第一次出现到最后一次出现的分隔符:


import re

answer = """

models sold in last 4 weeks

+---------------+

|      pcid     |

+---------------+

|     22bv03    |

|     3eer3d    |

|  fes44h2j555j |

| 4mee33ikj5sq1 |

|  99dkk3bvr32a |

| cv44trmq011sa |

|    lo33xc1a   |

+---------------+***For more information, please visit the company page.

"""

sep = '+---------------+'

m = re.search(r'(?sm)^{0}.*{0}'.format(re.escape(sep)), answer)

if m:

    print(m.group())

正则表达式详细信息

  • (?sm)- 点现在匹配换行符并^匹配行首

  • ^- 一行的开始

  • \+---------------\+ - 分隔符模式

  • .*- 尽可能多的任何 0+ 字符

  • \+---------------\+- 分隔符模式


查看完整回答
反对 回复 2022-06-28
?
RISEBY

TA贡献1856条经验 获得超5个赞

我尝试如下

第 1 步:通过运行以下代码确定索引范围

print(answer.index("ks")) 
print(answer.index("***"))

一旦找到范围,您将找到表 ie 的索引范围[28:226]并注释掉此代码。

第2步:

print(answer[28:226])


查看完整回答
反对 回复 2022-06-28
  • 3 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号