可靠地匹配行内的网址

时间:2019-04-09 16:11:32

标签: regex python-3.x

我在弄清楚我认为非常简单的正则表达式时遇到了一些麻烦。我正在尝试使用Python创建一个Twitter机器人,以推文某位作者的引文。 我需要它:

  • 从文件中读取引号和网址
  • 将引号和网址分开,以便可以添加引号 引用部分周围,并使用url部分确定哪本书 引用来自并添加相关的书籍封面
  • 我还需要分开网址以计算之后的推文长度 Twitter缩短了网址
  • 最后一件事:某些引号可能没有url,我需要它来标识它并添加一些随机图片作为后备广告。

经过反复试验,我想出了这个正则表达式,当我测试它时似乎可以完成工作:r'(?P<quote>.*)(?P<link>https.*)?'

因为我不需要验证url,所以我认为我不需要任何复杂的正则表达式,例如我在研究中遇到的正则表达式。

但是当我尝试启动该bot时,我意识到它无法正确解析引号,而是将整行捕获为“ quote”(并且无法识别网址)。

让我感到困惑的是,它并没有始终如一地失败,相反,似乎有时它会起作用,而有时却不会。

以下是我尝试执行的操作失败的示例:https://regex101.com/r/mODPUq/1/

这是我编写的全部功能:

def parseText(text):
    # Separate the quote from the link
    tweet = {}
    regex = r'(?P<quote>.*)?(?P<link>https.*)?'

    m = re.search(regex, text)

    tweet = m.groupdict("")

    return tweet

[EDIT]好吧,我并没有以这种方式解决问题,但是找到了一种可能不太完善但至少看起来能解决问题的解决方法:

  • 我有2个独立的函数,一个用于获取url,另一个用于将url分开行并单独返回引号。
  • 我首先呼叫getUrl(),然后仅当它返回非None的值时,才呼叫getQuote()。如果为url == None,我可以直接发布整条推文。

这样,正则表达式部分变得非常简单,无论有没有URL,到目前为止,它似乎都能正常工作。我只是有一个小问题,即使没有网址,即使我使用str.split('/n')切出换行符也必须存在,因为当我加引号时,最后一个在换行符上。

由于技术上没有解决问题,我暂时保留了该问题,这要归功于那些给了我答案的人,但它似乎没有用。

1 个答案:

答案 0 :(得分:1)

您还可以将正则表达式字符串更改为r'(?P<quote>.*)?.(?P<link>https.*)',这还会处理引号和链接之间的所有多余字符