【问题标题】:How to make string from regex and value of group如何从正则表达式和组值制作字符串
【发布时间】:2010-06-07 13:06:09
【问题描述】:

我有 twitter 个人资料 url 和某人的 twitter 个人资料 url 的正则表达式。我可以很容易地从 url 中提取用户名。

>>> twitter_re = re.compile('twitter.com/(?P<username>\w+)/')
>>> twitter_url = 'twitter.com/dir01/'
>>> username = twitter_re.search(twitter_url).groups()[0]
>>> _
'dir01'

但是如果我有正则表达式和用户名,我如何获得 url?

【问题讨论】:

  • 我建议在该正则表达式中转义 .,以便它实际上匹配 "."
  • 是的,我知道。它只是在玩 shell,仅此而已。

标签: python regex replace


【解决方案1】:

Regexen 不是双向的。您可以使用它们来解析字符串,但不能从结果中生成字符串。您可能应该研究另一种获取 URL 的方法,例如基本字符串插值或 URI 模板(请参阅http://code.google.com/p/uri-templates/

【讨论】:

  • 这不是真的——正则表达式严格来说是正则生成语法的简写形式,顾名思义,它用于生成属于一种语言的字符串。虽然大多数正则表达式引擎只支持解析,但还有其他库支持生成。
  • @Konrad Rudolph:虽然生成规则像“来自用户名的 Twitter URL”这样狭窄的生成规则,但这样的库肯定是错误的方法。 ;-)
  • @dir01:你真的应该解释你想要什么。我敢肯定,你想要什么和你在这里问什么是完全不同的两件事。
  • @tomalak 我尝试做的是 django-elsewhere 的克隆,django 应用程序用于提供有关其他 Web 服务用户注册的信息。用户应该能够提供用户名或网址,有些网站也提供多个网址(example.com/id(\d+) 或coolname.example.com)
  • @dir01:在我看来,您需要以"&lt;placeholder&gt;.example.com" 的形式进行字符串插值,就像@Mike Boers 建议的那样。
【解决方案2】:

如果您不是在寻找将任何正则表达式转换为格式化字符串的通用解决方案,而是您可以硬编码的东西:

twitter_url = 'twitter.com/%(username)s/' % {'username': 'dir01'}

...应该给你你需要的东西。

如果您想要更通用(但不是非常强大的解决方案):

import re

def format_to_re(format):
    # Replace Python string formatting syntax with named group re syntax.
    return re.compile(re.sub(r'%\((\w+)\)s', r'(?P<\1>\w+)', format))

twitter_format = 'twitter.com/%(username)s/'
twitter_re = format_to_re(twitter_format)

m = twitter_re.search('twitter.com/dir01/')
print m.groupdict()
print twitter_format % m.groupdict()

给我:

{'username': 'dir01'}
twitter.com/dir01/

最后,我自己一直在使用的更大更完整的解决方案可以在Patternhere 中找到。

【讨论】:

  • 但我正在寻找通用解决方案
  • @dir01:我添加了一些更通用的解决方案。最后一个可能完全矫枉过正,但它可能会做你想做的。
  • @dir01:您也可以轻松修改它以正确匹配不同的格式选项...
【解决方案3】:

为什么需要正则表达式 - 只需附加字符串。

base_url = "twitter.com/"
twt_handle = "dir01"
twit_url = base_url + twt_handle

【讨论】:

    猜你喜欢
    • 2016-08-23
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2016-09-01
    • 2014-04-24
    • 1970-01-01
    • 2022-06-28
    相关资源
    最近更新 更多