<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Council of Elrond</title><link>https://songkou.github.io/tags/python/</link><description>Recent content in Python on Council of Elrond</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 06 Oct 2023 23:23:10 +0800</lastBuildDate><atom:link href="https://songkou.github.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>Smart Way to do Regex</title><link>https://songkou.github.io/posts/smart_way_do_regex/</link><pubDate>Fri, 06 Oct 2023 23:23:10 +0800</pubDate><guid>https://songkou.github.io/posts/smart_way_do_regex/</guid><description>&lt;p&gt;Below is a sample code that I found to get complex regex pattern instead of write it manually
good example to make smaller parts first the combine to a very complex pattern.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# convert the {name} test to rules in predefined format in macros&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;regex_expand&lt;/span&gt;(macros, pattern, guarded &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; len(pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; pos &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; size:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern[pos]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ch &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\\&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; ch &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;{&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(ch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern&lt;span style="color:#f92672"&gt;.&lt;/span&gt;find(&lt;span style="color:#e6db74"&gt;&amp;#39;}&amp;#39;&lt;/span&gt;, pos)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; p2 &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(ch)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p3 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p2 &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern[pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:p2]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; name &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:p3])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; name[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isdigit():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(pattern[pos:p3])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; name) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; name):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;invalid pattern name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; name &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; macros:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;{&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;} is undefined&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;name)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; guarded:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(&lt;span style="color:#e6db74"&gt;&amp;#39;(?:&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; macros[name] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(macros[name])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(output)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# given a set of rules, create rules dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;regex_build&lt;/span&gt;(code, macros &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;, capture &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; macros &lt;span style="color:#f92672"&gt;is&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; k, v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; macros&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[k] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; v
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line_num &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#f92672"&gt;in&lt;/span&gt; code&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line_num &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; line &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;not&lt;/span&gt; line) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pos &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;find(&lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; pos &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: not a valid rule&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;line_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; head &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line[:pos]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; body &lt;span style="color:#f92672"&gt;=&lt;/span&gt; line[pos &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\r\n\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;not&lt;/span&gt; head):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: empty rule name&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;line_num)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; head[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;]&lt;span style="color:#f92672"&gt;.&lt;/span&gt;isdigit():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid rule name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, head))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; head) &lt;span style="color:#f92672"&gt;or&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;in&lt;/span&gt; head):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid rule name &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, head))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; regex_expand(defined, body, guarded &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; capture)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; e:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, str(e)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;compile(pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;except&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;error:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;raise&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ValueError&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%d&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: invalid pattern &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(line_num, pattern))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; capture:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[head] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pattern
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; defined[head] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;(?P&amp;lt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;(head, pattern)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; defined
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# define a set of rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rules &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;r&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; protocol = http|https
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login_name = [^:@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login_pass = [^@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; login = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login_name}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;(:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login_pass}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; host = [^:/@\r\n\t ]+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; port = \d+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; optional_port = (?:[:]&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{port}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; path = /[^\r\n\t ]*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; url = &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{protocol}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;://(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{login}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;[@])?&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{host}{optional_port}{path}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# convert above rules to dictionary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; regex_build(rules, capture &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print dictionary info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; k, v &lt;span style="color:#f92672"&gt;in&lt;/span&gt; m&lt;span style="color:#f92672"&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(k, &lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, v)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# use final rule &amp;#34;url&amp;#34; to regex a text&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pattern &lt;span style="color:#f92672"&gt;=&lt;/span&gt; m[&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;s &lt;span style="color:#f92672"&gt;=&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;(pattern, &lt;span style="color:#e6db74"&gt;&amp;#39;https://name:pass@www.test.com:8080/abcdefg&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print the complete list of matches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#39;matched: &amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;%&lt;/span&gt;s&lt;span style="color:#f92672"&gt;.&lt;/span&gt;group(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# print the matched items based on rule defined names&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; name &lt;span style="color:#f92672"&gt;in&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;login_name&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;login_pass&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;host&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;port&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#39;subgroup:&amp;#39;&lt;/span&gt;, name, &lt;span style="color:#e6db74"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;, s&lt;span style="color:#f92672"&gt;.&lt;/span&gt;group(name))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output:&lt;/p&gt;</description></item><item><title>Python_One_line</title><link>https://songkou.github.io/posts/python_one_line/</link><pubDate>Mon, 22 Nov 2021 22:08:48 +0800</pubDate><guid>https://songkou.github.io/posts/python_one_line/</guid><description>&lt;h2 id="tricks-to-write-python-in-one-line"&gt;Tricks to write Python in one line&lt;/h2&gt;
&lt;h3 id="get-dict-output-value"&gt;Get dict output value&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dict_test = {&amp;#34;A&amp;#34;: 100, &amp;#34;B&amp;#34;: 99, &amp;#34;C&amp;#34;: 33, &amp;#34;D&amp;#34;: 120}

output = [(key, value) for key, value in dict_test.items() if value &amp;gt;= 100]

print(f&amp;#34;the output is ：{output}&amp;#34;)

the output is ：[(&amp;#39;A&amp;#39;, 100), (&amp;#39;D&amp;#39;, 120)]

type(output)
list
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="filter-words-that-is-more-than-3-characters-in-a-sentence"&gt;Filter words that is more than 3 characters in a sentence&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;text = &amp;#39;&amp;#39;&amp;#39;Outside, the moon is shedding its cold light on the cold snow,\nand the white-bearded fir-trees round Camp Villa1 are casting a blue shadow across the white ground, \nwhile the Rev2&amp;#39;&amp;#39;&amp;#39;
output = [[x for x in line.split() if len(x) &amp;lt; 3] for line in text.split(&amp;#34;\n&amp;#34;)]
print(f&amp;#34;the output is：{output}&amp;#34;)

the output is：[[&amp;#39;is&amp;#39;, &amp;#39;on&amp;#39;], [&amp;#39;a&amp;#39;], []]

#logic is: 1st,split the text to a list, separater is &amp;#34;\n&amp;#34;(new line),
#2nd, for each line, split by space, which becomes a list again. 
#3rd, for each word in 2nd list, if the length of the word is less than 3(less than 3 characters) 
#put 3rd result in to a list. then for each line you get a list, combine it to a matrix
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="remove-spaces-beforeafter-the-text"&gt;Remove spaces before/after the text&lt;/h3&gt;
&lt;p&gt;I modified log file to make a simple demo.&lt;/p&gt;</description></item><item><title>Python_Regex</title><link>https://songkou.github.io/posts/python_regex/</link><pubDate>Tue, 12 Oct 2021 20:59:46 +0800</pubDate><guid>https://songkou.github.io/posts/python_regex/</guid><description>&lt;h2 id="some-advanced-usage-on-regex"&gt;Some Advanced usage on regex&lt;/h2&gt;
&lt;h3 id="get-float-number"&gt;get float number:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import re
target = &amp;#39;total growth is : 8%-8.5%&amp;#39;
rate = re.findall(&amp;#39;(\d+(?:\.\d+)?)&amp;#39;, target)
print(rate)
[&amp;#39;8&amp;#39;, &amp;#39;8.5&amp;#39;]
#\d is any int, + is one to many
#(?:...)
#A non-capturing group allows you to apply quantifiers to part of your regex but does not capture/assign an ID.
#so it means: find int or, if int follows a &amp;#34;.&amp;#34; and any int afterwards, combine the int with &amp;#34;.int&amp;#34;
#For example, repeating 1-3 digits and a period 3 times can be done like #this: /(?:\d{1,3}\.){3}\d{1,3}/
#above regex can match string like : 219.254.232.123 or 232.212.222.3434 (can only go until 232.212.222.343), 
#can not match 232.2122.222.3434 or 232.212.22a.3434

#`(\d+(?:\.\d+)?)` is a group, so result will be put in a list. 

#if you just want to match any int or .xxx or xxxx.xxx,just use

rate = re.findall(&amp;#39;(\d+(\.\d+)?)&amp;#39;, target)
print(rate)
[(&amp;#39;8&amp;#39;, &amp;#39;&amp;#39;), (&amp;#39;8.5&amp;#39;, &amp;#39;.5&amp;#39;)]
#which will return a list to you

#if you just want to find a float, use below: 

target = &amp;#39;total growth is : 8%-8.5% or 9.546%&amp;#39;
rate = re.findall(&amp;#39;(\d+\.\d+)&amp;#39;, target)
print(rate)
[&amp;#39;8.5&amp;#39;, &amp;#39;9.546&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="a-bit-deeper"&gt;A bit deeper:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;A(?=B)&lt;/code&gt; ：Match &lt;strong&gt;String A&lt;/strong&gt; &lt;em&gt;ends&lt;/em&gt; with &lt;strong&gt;String B&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Python_mysql</title><link>https://songkou.github.io/posts/python_mysql/</link><pubDate>Sun, 07 Feb 2021 13:21:07 +0800</pubDate><guid>https://songkou.github.io/posts/python_mysql/</guid><description>&lt;h1 id="python-query-mysql"&gt;Python Query mysql&lt;/h1&gt;
&lt;p&gt;To use Python to query mysql DB. There are two popular modules are used:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;pymysql&lt;/li&gt;
&lt;li&gt;sqlalchemy ( need to install mysqlconnector in my scenario) &lt;code&gt;pip install mysql-connector-python&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="pymysql"&gt;pymysql:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ekoudb = pymysql.connect(host=&amp;#39;10.10.80.127&amp;#39;, 
 port=3306, 
 user=&amp;#39;ekou&amp;#39;, 
 password=&amp;#39;abcd12334&amp;#39;, 
 database=&amp;#39;ekoutest&amp;#39;) 
 
 #get cursor 
cursor = ekoudb.cursor()

def insert_a_item(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34; 
 Insert items &amp;#34;&amp;#34;&amp;#34; 
 try: 
 cursor.execute(SqlLang) 
 ekoudb.commit() 
 except Exception as e: 
 print(&amp;#39;Insert data fail&amp;#39;) 
 print(e) 
 ekoudb.rollback() 
 # release resource 
 cursor.close() 
 ekoudb.close() 
#insert_a_item(SQL_INSERT_A_ITEM)
SQL_INSERT_MANY_ITEMS = &amp;#34;INSERT INTO bird_table (origin, hostname,descr,ver,protocol,neighboraddr,neighboras,status,sinceday,sincetime) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)&amp;#34;

MULTIENTRY = [[&amp;#34;update&amp;#34;,&amp;#34;host1&amp;#34;,&amp;#34;descr1&amp;#34;,&amp;#34;ipv6&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;2123123&amp;#34;,&amp;#34;231233&amp;#34;,&amp;#34;Idle&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;16:50:07&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host2&amp;#34;,&amp;#34;descr2&amp;#34;,&amp;#34;ipv6&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;ipv6_addr1&amp;#34;,&amp;#34;65300&amp;#34;,&amp;#34;Idle&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;16:50:07&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host3&amp;#34;,&amp;#34;descr3&amp;#34;,&amp;#34;ipv4&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;10.10.1.1&amp;#34;,&amp;#34;65002&amp;#34;,&amp;#34;Established&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;15:50:13&amp;#34;],\ 
[&amp;#34;update&amp;#34;,&amp;#34;host4&amp;#34;,&amp;#34;descr4&amp;#34;,&amp;#34;ipv4&amp;#34;,&amp;#34;BGP&amp;#34;,&amp;#34;10.10.1.3&amp;#34;,&amp;#34;65003&amp;#34;,&amp;#34;Established&amp;#34;,&amp;#34;2021-02-02&amp;#34;,&amp;#34;15:50:13&amp;#34;]]

def insert_items(MANYTIMESFORMAT,SqlLang): 
 try: 
 cursor.executemany(MANYTIMESFORMAT, SqlLang) 
 ekoudb.commit() 
 except Exception as e: 
 print(&amp;#34;Insert_error&amp;#34;) 
 ekoudb.rollback() 
 # release resource 
 cursor.close() 
 ekoudb.close()

def query(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34;query&amp;#34;&amp;#34;&amp;#34; 
 # query all data 
 cursor.execute(SqlLang) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 print(&amp;#39;| origin | hostname | descr | ver | protocol | \ 
 neighboraddr | neighboras | status | sinceday | sincetime |&amp;#39;) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 # matrix data 
 rows = cursor.fetchall() 
 for row in rows: 
 origin = row[0] 
 hostname = row[1] 
 descr = row[2] 
 ver = row[3] 
 protocol = row[4] 
 neighboraddr = str(row[5]) 
 neighboras = str(row[6]) 
 status = row[7] 
 sinceday = str(row[7]) 
 sincetime = str(row[9]) 
 
# print(&amp;#39;| &amp;#39; + origin.rjust(2) + &amp;#39;|&amp;#39;.rjust(7) + hostname.rjust(2) + &amp;#39;|&amp;#39;.rjust(10) + descr.rjust(2) + &amp;#39;|&amp;#39;.rjust(26) + ver.rjust(2) + &amp;#39;|&amp;#39;.rjust(5) + protocol.rjust(2) + &amp;#39;|&amp;#39;.rjust(9) + neighboraddr.rjust(2) + + &amp;#39;|&amp;#39;.rjust(25) + neighboras.rjust(2) + &amp;#39;|&amp;#39;.rjust(11) + status.rjust(2) + &amp;#39;|&amp;#39;.rjust(12) + sinceday.rjust(2) + &amp;#39;|&amp;#39;.rjust(11) + sincetime.rjust(2)) 
# print(&amp;#39;| &amp;#39; + origin.rjust(2) + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + hostname + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39;+ descr + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + ver + &amp;#39;\t|&amp;#39; + &amp;#39;\t&amp;#39; + protocol + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+neighboras + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+neighboraddr + &amp;#39;\t|&amp;#39;+&amp;#39;\t&amp;#39;+status + &amp;#39;\t|&amp;#39;+ &amp;#39;\t&amp;#39; + sinceday + &amp;#39;\t|&amp;#39;+ &amp;#39;\t&amp;#39; +sincetime + &amp;#39;\t|&amp;#39;) 
 print(&amp;#39;|&amp;#39; + format(origin,&amp;#34;&amp;lt;8&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(hostname,&amp;#34;&amp;lt;10&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(descr,&amp;#34;&amp;lt;26&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(ver,&amp;#34;&amp;lt;5&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(protocol,&amp;#34;&amp;lt;9&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(neighboraddr,&amp;#34;&amp;lt;25&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(neighboras,&amp;#34;&amp;lt;11&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(status,&amp;#34;&amp;lt;12&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(sinceday,&amp;#34;&amp;lt;11&amp;#34;) + format(&amp;#34;|&amp;#34;,&amp;#34;&amp;lt;2&amp;#34;) + format(sincetime,&amp;#34;&amp;lt;10&amp;#34;) + &amp;#34;|&amp;#34; ) 
 print(&amp;#39;+--------+-----------+---------------------------+------+----------+-\ 
-------------------------+------------+-------------+------------+-----------+&amp;#39;) 
 # release resource 
 cursor.close() 
 ekoudb.close()
 


SQL_UPDATE = &amp;#34;UPDATE bird_table SET hostname=&amp;#39;%s&amp;#39;,status=&amp;#39;%s&amp;#39; WHERE descr=&amp;#39;%s&amp;#39;&amp;#34; 
 
def update(SqlLang): 
 &amp;#34;&amp;#34;&amp;#34; 
 update 
 :return: &amp;#34;&amp;#34;&amp;#34; sql_update = SqlLang % (&amp;#39;hostname3&amp;#39;, &amp;#39;connect&amp;#39;, &amp;#39;descr_1&amp;#39;) 
 try: 
 cursor.execute(sql_update) 
 ekoudb.commit() 
 except Exception as e: 
 ekoudb.rollback() 
 print(&amp;#39;error when update data&amp;#39;) 
 print(e) 
 # release resource 
 cursor.close() 
 ekoudb.close() 
 
update(SQL_UPDATE)
SQL_DELETE = &amp;#34;DELETE FROM bird_table WHERE descr=&amp;#39;%s&amp;#39;&amp;#34; 
 
def delete(SqlLang,delete_string): 
 &amp;#34;&amp;#34;&amp;#34; 
 delete record 
 :return: &amp;#34;&amp;#34;&amp;#34; try: 
 # delete sql 
 sql_del = SqlLang % (delete_string) 
 cursor.execute(sql_del) 
 ekoudb.commit() 
 except Exception as e: 
 # rollback when error 
 ekoudb.rollback() 
 print(e) 
 # release resource 
 cursor.close() 
 ekoudb.close() 
 
delete(SQL_DELETE,&amp;#39;23123213213&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sqlalchemy"&gt;sqlalchemy:&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;engine = create_engine(&amp;#34;mysql+mysqlconnector://ekou:PASSWORD@10.10.80.127:3306/ekoutest?charset=utf8mb4&amp;#34;)

metadata = MetaData(engine) 
 
Session = sessionmaker() # create a customized session 
Session.configure(bind=engine) # link to this session 
session = Session()
users_table = Table(&amp;#39;bird_table&amp;#39;, metadata, autoload=True)

result=users_table.select(and_(users_table.c.descr == &amp;#34;descr&amp;#34;, users_table.c.neighboraddr == &amp;#34;NEIGHBOR_ADDR&amp;#34;)).execute() 
for item in result.fetchall(): 
 print (item)

&amp;#39;&amp;#39;&amp;#39; 
create table 
&amp;#39;&amp;#39;&amp;#39; 
users_table = Table(&amp;#39;users&amp;#39;, 
 metadata, 
 Column(&amp;#39;id&amp;#39;, Integer, primary_key=True), 
 Column(&amp;#39;name&amp;#39;, String(40)), 
 Column(&amp;#39;email&amp;#39;, String(120))) 
if not users_table.exists(): 
 users_table.create() 
 
&amp;#39;&amp;#39;&amp;#39; 
load table 
&amp;#39;&amp;#39;&amp;#39; 
users_table = Table(&amp;#39;users&amp;#39;, metadata, autoload=True) 
 
&amp;#39;&amp;#39;&amp;#39; 
insert 
&amp;#39;&amp;#39;&amp;#39; 
users_table.insert().execute(name=&amp;#34;sss&amp;#34;, email=&amp;#34;eee@eee.com&amp;#34;) 
users_table.insert().execute(name=&amp;#34;ttt&amp;#34;, email=&amp;#34;tt@eee.com&amp;#34;) 
&amp;#39;&amp;#39;&amp;#39; 
update 
&amp;#39;&amp;#39;&amp;#39; 
users_table.update(users_table.c.name == &amp;#34;ttt&amp;#34;).execute(name=&amp;#34;ddd&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="conclusion"&gt;conclusion:&lt;/h3&gt;
&lt;p&gt;for easier get on hand, pymsql would be good enough to use. but for advanced, need to use sqlalchemy.&lt;/p&gt;</description></item></channel></rss>