Python取代正则表达式组

时间:2015-03-02 07:57:19

标签: python regex python-2.7

我正在使用Python version 2.7.6

我有一个表达ftp uri的表达式;

pattern = re.compile(r'ftp://((?P<username>[^:.]+):(?P<password>[^@.]+)@)?(?P<host>[^:.]+):(?P<port>[^/.]+)(?P<path>.+)')

假设我有一个与模式相匹配的字符串;

my_ftp_uri="ftp://somehost:21/blah_blah_path.file"

我想要的是根据正则表达式组位置为该uri添加用户名和密码。 我希望有一种类似的方式;

match=pattern.search(my_ftp_uri)
match.groupdict()
>>> {'username': None, 'path': '/blah_blah_path.file', 'host': 'somehost', 'password': None, 'port': '21'}

match.group_replace({'username':'my_username','password':'my_password'})
>>> "ftp://my_username:my_password@somehost:21/blah_blah_path.file"

我搜索了它,可以找到一些正则表达式替换。但他们正在取代正则表达式中的一组部分。我实际上想要在匹配正则表达式的字符串中替换或设置组值。

你知道用regex替换字符串中某些匹配组值的方法吗?

1 个答案:

答案 0 :(得分:0)

我认为不可能,因为捕获用于获取我们想要的信息。相反,我使用正则表达式检查字符串的格式,并重新构建输出,以便使用现有字典和新数据获取所需的字符串。

以下是此方法的一个示例:

host = ["YOUR.COM", "YOUR.COM2", "YOUR.COM3"]
password = ["PASS4", "PASS5", "PASS6"]
user = ["USER2", "USER3", "USER4"]
port = ["345", "355", "365"]
path = ["/GO.to.page11","/GO.to.page22","/GO.to.page33"]
p = re.compile(ur'ftp:\/\/(?:(?P<username>[^.:]+):(?P<password>[^@.]+)@)?(?P<host>[^:.]+):(?P<port>[^\/.]+)(?P<path>.+)', re.MULTILINE)
test_str = u"my_ftp_uri=\"ftp://somehost:21/blah_blah_path.file\""
test_str2 = u"my_ftp_uri=\"ftp://username:pass@somehost:21/blah_blah_path.file\""

matchObj = p.search(test_str)                  # Test 1
if matchObj and matchObj.group(1) != None:
    for i, entry in enumerate(host):
        print p.sub(ur"ftp://" + user[i] + ":" + password[i] + "@" + host[i] + ":" + port[i] + path[i], test_str)
else:
    for i, entry in enumerate(host):
        print p.sub(ur"ftp://" + host[i] + ":" + port[i] + path[i], test_str)

matchObj2 = p.search(test_str2)                 # Test 2
if matchObj2 and matchObj2.group(1) != None:
    for i, entry in enumerate(host):
        print p.sub(ur"ftp://" + user[i] + ":" + password[i] + "@" + host[i] + ":" + port[i] + path[i], test_str2)
else:
    for i, entry in enumerate(host):
        print p.sub(ur"ftp://" + host[i] + ":" + port[i] + path[i], test_str2)