使用自定义正则表达式验证 LinkedIn URL

4
我正在尝试标准化linkedin网址。为此,我使用正则表达式^https:\/\/[w]{3}\.linkedin\.com\/.*$,这需要根据新的要求进行更改。
唯一有效的模式是:
  • https://www.linkedin.com/in/XXXXXX-XXXXX-55301b41
  • https://www.linkedin.com/pub/XXXXXX-XXXXX-55301b41
  • https://www.linkedin.com/public-profile/in/XXXXXX-XXXX-b82a7b10a
  • https://www.linkedin.com/public-profile/pub/XXXXXX-XXXX-b82a7b10a
一些不好的特殊情况包括:
  • https://www.linkedin.com/in/xxxx-xxxx-ab85a328/%7Bcountry%3Dde%2C+language%3Dde%7D?trk=people-guest_profile-result-card_result-card_full-click
  • https://www.linkedin.com/edu/school?id=18987
  • https://www.linkedin.com/in/xxxx-xxxx-55301b41/de
  • https://www.linkedin.com/pub/xxxxx-xxxxx/98/b7a/22b
  • https://it.linkedin.com/public-profile/in/xxxx-xxxxx-80520667?challengeId=AQEV3tHveORYsAAAAXQqx1N3bZ7fd44s5ngegJp6rC0UoWvhG2LtAhhgld8h3QyBxorfcLL2iuvK4xh_UKoGguxvX6sFx_nnZA&submissionId=7bc972ed-bfd1-2e16-c395-ad35cb550117
逻辑如下:
  • 必须以https://www.linkedin.com/开头
  • 必须有/in/,/pub/,/public-profile/in/或/public-profile/pub
  • 应以用户名结尾,即XXXXXX-XXXXX-55301b41
2个回答

3

仅根据您展示的样本,请尝试使用以下正则表达式。 正则表达式的在线演示为:Online demo of regex

^http[s]?:\/\/www\.linkedin\.com\/(in|pub|public-profile\/in|public-profile\/pub)\/([\w]{6}-[\w]{1,}-[\w]+)$

说明: 对上述内容进行详细解释。

^http[s]?:                    ##Checking if URL starts from http OR https.
\/\/www\.linkedin\.com\/      ##Then checking if domain is www.linkedin.com
(in|pub|public-profile\/in|public-profile\/pub)  ##Then checking if its followed by in OR pub OR public-profile/in OR public-profile/pub
\/([\w]{6}-[\w]{1,}-[\w]+)$   ##Checking if above is followed by / [\w] with 6 occurrences - [\w] with 1 or more occurrences and then [\w] with 1 or more occurrences.

注意: 如果您想检查URL是否只以https开头,则请将上述正则表达式中的^http[s]?更改为^https

注意2: 上面的方法将创建两个捕获组。如果您不想创建任何捕获组,请尝试以下操作。

^http[s]?:\/\/www\.linkedin\.com\/(?:in|pub|public-profile\/in|public-profile\/pub)\/(?:[\w]{6}-[\w]{1,}-[\w]+)$

笔记2正则表达式演示


有一个需要注意的是,第三级域名可能不总是“www”,例如我相信对于加拿大人来说,它可能是“ca.linkedin.com”。 - NoDisplayName
FYI,在URL末尾加上反斜杠会破坏你的正则表达式。 - fatfrog

0

不要使用正则表达式来匹配整个字符串,尝试先使用 URL 解析器,然后分别验证方案、网络位置和路径。

>>> import urllib.parse
>>> urllib.parse.urlparse("https://www.linkedin.com/in/XXXXXX-XXXXX-55301b41")
ParseResult(scheme='https', netloc='www.linkedin.com', path='/in/XXXXXX-XXXXX-55301b41', params='', query='', fragment='')
>>> urllib.parse.urlparse("https://www.linkedin.com/in/xxxx-xxxx-ab85a328/%7Bcountry%3Dde%2C+language%3Dde%7D?trk=people-guest_profile-result-card_result-card_full-click")
ParseResult(scheme='https', netloc='www.linkedin.com', path='/in/xxxx-xxxx-ab85a328/%7Bcountry%3Dde%2C+language%3Dde%7D', params='', query='trk=people-guest_profile-result-card_result-card_full-click', fragment='')

组件验证

>>> parsed_url = urllib.parse.urlparse("https://www.linkedin.com/in/XXXXXX-XXXXX-55301b41")
>>> parsed_url.scheme == "https"
True
>>> parsed_url.netloc.endswith(".linkedin.com")
True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接