使用 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) 相同,添加到问题中
@runcode 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 提取字符串的主要内容,如果未能解决你的问题,请参考以下文章