匹配多个以结尾的字符串

时间:2018-12-21 14:24:52

标签: python

我正在寻找一种更有效的方式来匹配文本块中的多个任意域。

我有一段文字如下:

'''
    foo
    my.domain1
    batman.my.domain1
    superman.my.domain2 foo bar wonderwoman.my.domain1
'''

我要匹配
的所有子域 my.domain1my.domain2

此处所需的输出为:

  

['batman.my.domain1','superman.my.domain2','wonderwoman.my.domain1']

我已经通过使用正则表达式的这个怪物来部分完成了任务,而这肯定不是最有效的方法:

r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,}[a-zA-Z0-9])?\.)+my.domain1|(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,}[a-zA-Z0-9])?\.)+my.domain2'

有更好的方法吗?

示例代码:

import re

text = '''
    foo
    my.domain1
    batman.my.domain1
    superman.my.domain2 foo bar wonderwoman.my.domain1
'''

pattern = r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,}[a-zA-Z0-9])?\.)+my.domain1|(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,}[a-zA-Z0-9])?\.)+my.domain2'
print(re.findall(pattern, text))

# Desired output is:
# ['batman.my.domain1', 'superman.my.domain2', 'wonderwoman.my.domain1']

P.S-my.domain1和my.domain2是示例域,真实域的末尾没有数字。

3 个答案:

答案 0 :(得分:1)

我可以提供两项改进:

  1. 如果您不关心下划线,请使用\w作为[A-Za-z0-9_]的简写

  2. 使用(?:pattern1|pattern2)“概括”结尾。

import re

text = '''
    foo
    my.domain1
    batman.my.domain1
    superman.my.domain2 foo bar wonderwoman.my.domain1
'''

pattern = r'(?:\w+\.)+(?:my\.domain1|my\.domain2)'
print(re.findall(pattern, text))

如果要在域部分内匹配连字符:

pattern = r'(?:\w(?:[\w-]?\w)*\.)+(?:my\.domain1|my\.domain2)'

这将匹配asdf-ghjkl.my.domain1,但不匹配asdf--ghjkl.my.domain2(没有连续的连字符)。

对于连续的连字符序列:

pattern = r'(?:\w(?:[\w-]*\w)?\.)+(?:my\.domain1|my\.domain2)'

答案 1 :(得分:1)

endswith()帮了大忙。我尊重正则表达式,但是检查域是否为子域与.endswith()逻辑紧密相关,因此我避免为此使用正则表达式。而且,顺便说一下,与纯字符串相比,正则表达式的语法几乎无法读取。

accepted_domains = ['my.domain1', 'my.domain2']

text = '''
    foo
    my.domain1
    batman.my.domain1
    superman.my.domain2 foo bar wonderwoman.my.domain1
'''

result = []

for dom in text.lower().split():
    for acc_dom in accepted_domains:
        #if dom == acc_dom or dom.endswith('.' + acc_dom):  # if you want 'my.domain1' to be included
        if dom.endswith('.' + acc_dom):
            result.append(dom)

print(result)

输出:

['batman.my.domain1', 'superman.my.domain2', 'wonderwoman.my.domain1']

答案 2 :(得分:-2)

假设您真正想要的是一个带有两个句点的字符串...

ok you have to try this code.You can update your record.


$data = array('lngCount' => 'lngCount + 1'); // In this array the "key" **lngCount** must same as your database table **tblVisitorCounter** of columnname which you want to update
    $this->db->where('strYear', date("Y");
            if ($this->db->update('tblVisitorCounter', $data)) {
                return true;
            } else {
                return false;
            }