关于正则表达式提取的基本问题

时间:2019-03-22 21:23:39

标签: python regex python-regex

我需要提取在具有以下结构的URL中指定的ID:

https://trello.com/c/iGjJLqwr/1-test-project

在上面的示例中,我要提取:

iGjJLqwr

我需要在Zapier中使用根据文档使用python regex的regex表达式

以下python正则表达式在正确的方向上运行,但仍然返回太多:

[^https://trello.com/c/][\w]+

返回3个匹配项:

Match 1
Full match  21-29   iGjJLqwr
Match 2
Full match  31-36   -test
Match 3
Full match  36-44   -project

我需要将结果限制为:

iGjJLqwr

以下正则表达式返回一个额外的正斜杠

[^https://trello.com/c/]\w+/

Match 1
Full match  21-30   iGjJLqwr/

3 个答案:

答案 0 :(得分:2)

方括号[ ... ]创建一个字符集,该字符集选择其中包含的任何字符中的一个。如果在开始[^ ... ]处添加了克拉,则该组无效。该模式不考虑方括号内的完整连续字符串。

换句话说,[aaabbc]等效于[abc](甚至是[cba])。

如果您只想捕获组https://trello.com/c/之后的第一个路径元素,则可以使用以下模式:

https://trello\.com/c/([^/]+).*

演示:https://regex101.com/r/99FDJS/2

如果您希望模式仅与URL中的此子字符串匹配,则可以使用正向先行和后向:

(?<=https://trello\.com/c/).+?(?=/.*)

演示:https://regex101.com/r/99FDJS/1

答案 1 :(得分:0)

这将与ID匹配,且没有多余的正斜杠:

import re

string = 'https://trello.com/c/iGjJLqwr/1-test-project'

match = re.search(r'[^https://trello.com/c/]\w*(?=/)', string)

print(match.group(0))
iGjJLqwr

(?=/)断言下一个字符是正斜杠。

答案 2 :(得分:0)

在模式中,您使用的character class仅匹配几个字符中的一个。以^开头将使其成为negated字符类,该字符类与不在字符类中的任何字符匹配。

由于字符类后面没有量词,因此此[^https://trello.com/c/]将匹配单个i-,然后\w+将匹配一个单词字符1次以上

这将为您提供匹配iGjJLqwr-test-project

我认为您是要匹配捕获组中的ID:

^https://trello\.com/c/(\w+)

regex101 demo

关于图案

  • ^声明字符串的开头
  • https://trello\.com/c/从字面上匹配https://trello.com/c/
  • (\w+)在组1中捕获,匹配单词字符1次以上