python 当第二个子字符串是可选的时,如何在两个子字符串之间获取正则表达式组

xkftehaa  于 2022-12-17  发布在  Python
关注(0)|答案(2)|浏览(92)

例如,我有6个字符串如下:

  • https://twitter.com/test1
  • http://twitter.com/test2
  • https://www.twitter.com/test3?
  • https://www.mobile.twitter.com/test4
  • https://www.twitter.com/test5?lang=en
  • https://www.instagram.com/test1insta

我想做的是从这些链接中提取twitter的“用户名”,所以在这种情况下,我想用正则表达式搜索每个链接,以获得twitter.com/之后的用户名,在链接的url参数为?的情况下,我想获得它之前的所有内容。
例如,它会是这样的:
x一个八个一个x一个九个一个x一个十个一个x一个十个一个x一个十个x一个十个一个x一个十个x一个
我已经使用搜索来获取模式,但我一直在纠结如何让它只提取我想要的部分。以下是我尝试过的方法:
username = re.search(r'twitter.com\/(.*)\?', stringsList)
这导致只匹配那些后面有问号的字符串,我理解。所以只有test3test5
我想我可以尝试通过以下操作使问号可选:
username = re.search(r'twitter.com\/(.*)\??', stringsList)
而是只返回所有的用户名以及我想要的所有附加内容,例如:
x 1米17个一个x 1米18个一个x 1米19个一个x 1米20个一个x 1米21个一个
但我希望它仍然只提取用户名作为组1,即使?应该是可选的。
我的正则表达式应该是什么样子的呢,或者我需要把它分开,先检查字符串是否有问号,然后根据它是否存在,使用两种不同的搜索方法吗?
我有一个代码为here的测试位
我一直在尝试使用this来确定我想要的正则表达式

jdgnovmf

jdgnovmf1#

要成为域不可知论者:

(?:https?:\/\/)?(?:[^?\/\s]+[?\/])([a-zA-Z0-9]*)

用户名应该在组1中。this answer的修改版本,它有几个其他的好方法。
我更改了最后一个过滤器,不包括特殊字符。如果下划线有效,则可以添加到最后一个捕获组:

(?:https?:\/\/)?(?:[^?\/\s]+[?\/])([a-zA-Z0-9_]*)

或者类似这样的东西把所有东西都放到?上:

(?:https?:\/\/)?(?:[^?\/\s]+[?\/])(.*?)\?
wi3ka0sx

wi3ka0sx2#

您可以使用查找来避免匹配第一部分。然后将右侧的匹配限制为除“?”和空格之外的任何字符。

(?<=twitter.com\/)[^?\s]+

可以通过删除组捕获(username.group(1)变为username)来简化python代码,如下所示:

twittercount = 0
NOTtwittercount = 0
for twitterURL in twitterURLs:
    if (twitterURL.twitter_url and 'twitter.com' in twitterURL.twitter_url):
        twittercount += 1
        username = re.search(r'(?<=twitter.com\/)[^?\s]+', twitterURL.twitter_url)
        print("correct twitter link =", twitterURL.twitter_url)
        print("extracted username =", username)
    else:
        NOTtwittercount += 1
        print("incorrect twitter link =", twitterURL.twitter_url)

正则表达式演示here。Python演示here

相关问题