首页 > 解决方案 > 摆脱默认文本

问题描述

在通过谷歌日历 API 获得对谷歌日历的访问权限后,我试图解析用户的事件描述。当我在我的程序中输入描述时,我想摆脱默认(和无用)的文本,例如 Zoom 会议邀请。如果下面是描述字符串

<br>Hi, please keep this text.<br>

<br>Bob is inviting you to a scheduled Zoom meeting.<br>

<br>Topic: Bob\'s Personal Meeting Room<br>
<br>Join Zoom Meeting<br>
<a href="https://us04web.zoom.us/j/4487518794?pwd=SkdaTE9nV3E1M3FSaWlOHYvNGlndz09">https://us04web.zoom.us/j/4487518794?pwd=SkdaTE9nV3E1M3FSaWplOHYvNGlndz09</a><br>
<br>Meeting ID: 448 751 8#94<br>
Password: 1F9W2P<br>

<br>Also not Zoom default text.

如何解析它,以便只保留“嗨,请保留此测试。也不是缩放默认文本”?

标签: pythonregexstringparsing

解决方案


方法

我认为这将是正则表达式或 RegEx 的一个很好的用途。这本质上是一种模式匹配标准,允许在字符串中泛化特定结构。虽然在 HTML 和 XML 中使用并不是一个好主意,因为它并非旨在提取您可能正在寻找的任何信息,但如果您只想丢弃某些部分,它应该可以工作。

解释

如果我理解正确,您希望留下

<br>Hi, please keep this text.<br>

<br>Also not Zoom default text.<br>

这意味着我们需要想出一个模式来匹配以下部分(括号表示每次将交换的信息):

<br>[Name] is inviting you to a scheduled Zoom meeting.<br>

<br>Topic: [Name]\'s Personal Meeting Room<br>
<br>Join Zoom Meeting<br>
<a href="[Link]">[Link]</a><br>
<br>Meeting ID: [ID]<br>
Password: [Password]<br>

重要部分:

  • 开头: [Name] 将是一些至少包含一个字符的字符串。为了确保您不匹配<br>Hi, please keep this text.<br>,我们要匹配任何不是“<br>”的字符(这在正则表达式中用 表示[^(?:<br>)]),其中“字符”表示除换行符以外的任何字符。句子的其余部分应该逐字匹配,所以我们不只是匹配任何东西。

  • 结尾:[密码]和[姓名]一样,都是[^(?:<br>)]出于同样的原因。

  • 此字符串以“<br>”开头和结尾。这应该反映在正则表达式中

  • 第一句和密码部分之间的所有内容,即使它们具有格式,它们也是通配符,至少包含一个字符或换行符(在正则表达式中用 表示 (.|\n)+

替换文本中的所有适当部分,您将获得以下内容:

<br>[^(?:<br>)]+? is inviting you to a scheduled Zoom meeting.+?Password: [^(?:<br>)]+?<br>

代码

对于 Python,re 模块将在这里派上用场,作为您的正则表达式帮助:我们希望将上述模式保存到一个变量中,并使用该信息从字符串中删除适当的部分。

要“保存”模式,re 模块允许您将正则表达式编译成一个对象(字符串前面的 r 表示它包含正则表达式)

import re
zoom_pattern = re.compile(r"<br>[^(?:<br>)]+? is inviting you to a scheduled Zoom meeting.+?Password: [^(?:<br>)]+?<br>")

该模块还提供了在字符串中拆分替换正则表达式匹配的功能,我们可以用空替换我们的匹配以将其从字符串中删除:

import re
s = " - string with zoom meeting stuff - "
zoom_pattern = re.compile(r"<br>[^(?:<br>)]+? is inviting you to a scheduled Zoom meeting.+?Password: [^(?:<br>)]+?<br>")

clean_string = zoom_pattern.sub("", s)

由于我们编译了该模式,您现在有了一种可重用的方式来清理您的字符串!

如果您想更改正则表达式以匹配每个单独的事物,只需调整之前的“重要点”以匹配您的目标。如果你想测试你的想法,是一个很棒的资源!


推荐阅读