使用 Python re.match 提取字符串

Posted

技术标签:

【中文标题】使用 Python re.match 提取字符串【英文标题】:Extract string with Python re.match 【发布时间】:2012-11-05 14:14:50 【问题描述】:
import re
str="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi"

str2=re.match("[a-zA-Z]*//([a-zA-Z]*)",str)
print str2.group()

current result=> error
expected => wwwqqqzzz

我想提取字符串wwwqqqzzz。我该怎么做?

可能有很多点,比如:

"whatever..s#$@.d.:af//wwww.xxx.yn.zsdfsd.asfds.f.ds.fsd.whatever/123.dfiid"

在这种情况下,我基本上想要/// 范围内的东西。我如何做到这一点?

另外一个问题:

import re
str="xxx.yyy.xxx:80"

m = re.search(r"([^:]*)", str)
str2=m.group(0)
print str2
str2=m.group(1)
print str2

好像m.group(0)m.group(1)是一样的。

【问题讨论】:

你想从最后的字符串中删除点吗? 是的,我只想要//和/之间的纯字符[a-zA-Z]*,在'//'之前有一堆字符,也在'/'之后, 【参考方案1】:

match 尝试匹配 整个 字符串。请改用search。然后,以下模式将符合您的要求:

m = re.search(r"//([^/]*)", str)
print m.group(1)

基本上,我们正在寻找/,然后使用尽可能多的非斜杠字符。并且那些非斜线字符将被捕获到第 1 组中。

事实上,有一种更高级的技术可以做到这一点,但不需要捕获(这通常很耗时)。它使用了所谓的lookbehind:

m = re.search(r"(?<=//)[^/]*", str)
print m.group()

lookarounds 不包含在实际匹配中,因此是所需的结果。

此(或任何其他合理的正则表达式解决方案)不会立即删除 .s。但这可以在第二步中轻松完成:

m = re.search(r"(?<=//)[^/]*", str)
host = m.group()
cleanedHost = host.replace(".", "")

这甚至不需要正则表达式。

当然,如果您想删除除字母和数字以外的所有内容(例如,将www.regular-expressions.info 转换为wwwregularexpressionsinfo),那么您最好使用replace 的正则表达式版本:

cleanedHost = re.sub(r"[^a-zA-Z0-9]+", "", host)

【讨论】:

对不起,我刚看到这个要求。只需运行另一个步骤:resultstr.replace(r".", "")。将在一秒钟内包括在内。 “有一种稍微高级一点的技术可以做同样的事情,但不需要捕获(这通常很耗时)。它使用所谓的lookbehind” - 你有什么要支持的这了?我的直觉和timeit 都告诉我,lookbehinds 比简单的组捕获要慢。 group(0) ,group(1) 是什么意思,在我的情况下 group(0) 结果与 group(1) 相同,添加到问题中 @runco​​de group(0) 为您提供完整的匹配。 group(1) 为您提供与第一组括号内的所有内容匹配的内容。在您的示例中,您将整个模式包装在括号中。因此,两个调用都给出相同的结果。 @lqc,我手头没有任何消息来源。我相信它主要适用于更复杂的模式,其中事物将被多次捕获。毕竟,引擎需要跟踪自进入捕获组以来匹配的内容。我承认,在任何特定情况下,回溯可能效率较低。【参考方案2】:
print re.sub(r"[.]","",re.search(r"(?<=//).*?(?=/)",str).group(0))

this demo

【讨论】:

【参考方案3】:
output=re.findall("(?<=//)\w+.*(?=/)",str)

final=re.sub(r"[^a-zA-Z0-9]+", "", output [0])

print final

【讨论】:

【参考方案4】:
import re
str_1="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi"

str2=re.match(".*//([a-zA-Z.]*)",str_1)
print(str2.group(1).replace('.',''))

【讨论】:

虽然此代码可能会解决问题,但 including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。【参考方案5】:
import re
str="x8f8dL:s://www.qqq.zzz/iziv8ds8f8.dafidsao.dsfsi"
re.findall('//([a-z.]*)', str)

【讨论】:

虽然代码可能会解决问题,但它本身并不是一个答案。应该始终为其添加解释。

以上是关于使用 Python re.match 提取字符串的主要内容,如果未能解决你的问题,请参考以下文章

python正则表达式

Python正则表达式 --匹配单个字符

re模块操作

re正则表达式方法

python re模块常见函数

一文搞懂Python中正则表达式