Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 可靠地匹配行内的url_Regex_Python 3.x - Fatal编程技术网

Regex 可靠地匹配行内的url

Regex 可靠地匹配行内的url,regex,python-3.x,Regex,Python 3.x,我很难弄清楚我认为什么是非常简单的正则表达式。我正在尝试用Python制作一个推特机器人,它可以推特一些作者的引用。 我需要它: 从文件中读取引用和url 将引号和url分开分析,以便它可以添加引号标记 围绕报价部分,并使用url部分确定哪本书 引用自并添加相关书籍封面 我还需要将url分开来计算发布后的tweet长度 推特缩短了网址 最后一件事:一些引用可能没有url,我需要它来识别它,并添加一些随机图片作为备用 经过反复试验和错误后,我提出了这个正则表达式,在我测试它时,它似乎起到了作用

我很难弄清楚我认为什么是非常简单的正则表达式。我正在尝试用Python制作一个推特机器人,它可以推特一些作者的引用。 我需要它:

  • 从文件中读取引用和url
  • 将引号和url分开分析,以便它可以添加引号标记 围绕报价部分,并使用url部分确定哪本书 引用自并添加相关书籍封面
  • 我还需要将url分开来计算发布后的tweet长度 推特缩短了网址
  • 最后一件事:一些引用可能没有url,我需要它来识别它,并添加一些随机图片作为备用
经过反复试验和错误后,我提出了这个正则表达式,在我测试它时,它似乎起到了作用:
r'(?p.*)(?Phttps.*)'

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

但是当我尝试启动bot时,我意识到它无法正确解析引号,而是将整行内容捕捉为“引号”(并且无法识别url)

让我困惑的是,它并没有一直失败,相反,它似乎有时有效,有时无效

下面是我尝试做的一个不可靠失败的例子:

以下是我编写的整个函数:

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
def parseText(文本):
#将报价与链接分开
tweet={}
regex=r'(?P.*)(?Phttps.*)'
m=重新搜索(正则表达式,文本)
tweet=m.groupdict(“”)
返回推文
[编辑]好的,我并没有用这种方式解决问题,但找到了一种可能不太优雅但至少似乎能解决问题的解决方法:

  • 我有两个独立的函数,一个用于获取url,另一个用于将url从行中拆分出来并单独返回报价
  • 我首先调用
    getUrl()
    ,然后只有当它返回的内容不是
    None
    ,我才调用
    getQuote()
    。如果
    url==None
    ,我可以直接推特整行内容
通过这种方式,regex部分变得非常简单,到目前为止,无论是否使用url,它似乎都可以工作。我只是有一个小问题,当没有url时,即使我使用
str.split('/n')
删除换行符,它也必须在那里,因为当我添加引号时,最后一个在换行符上


我暂时不讨论这个问题,因为技术上它还没有解决,多亏了那些给我答案的人,但它似乎不起作用。

您也可以将正则表达式字符串更改为
r'(?p.*)。(?Phttps.*))“
它还负责引号和链接之间的任何额外字符

它匹配整行,因为第一个
*
是贪婪的,第二个组是可选的,下面的
*
也是可选的。如果您想匹配http部分,可以使用
https?\S+
是的,只需将
组中贪婪的量词
*
更改为懒惰的
*?
,就可以了。您好,谢谢您的建议,不幸的是,它至少在调试器中似乎没有完全消除它。我知道贪婪的量词确实有问题,但仅仅是让它变懒似乎就可以让它一次抓住每一个字符。无论如何,我找到了一个解决方法,请看下文。谢谢,我试图使url在引用之后保持不变,所以无论如何,这不应该是一个问题。