我正在寻找一种更有效的方式来匹配文本块中的多个任意域。
我有一段文字如下:
'''
foo
my.domain1
batman.my.domain1
superman.my.domain2 foo bar wonderwoman.my.domain1
'''
我要匹配
的所有子域
my.domain1
和
my.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是示例域,真实域的末尾没有数字。
答案 0 :(得分:1)
我可以提供两项改进:
如果您不关心下划线,请使用\w
作为[A-Za-z0-9_]
的简写
使用(?: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;
}