<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Automation on Council of Elrond</title><link>https://songkou.github.io/categories/automation/</link><description>Recent content in Automation 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/categories/automation/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>Git_cheat_sheet</title><link>https://songkou.github.io/posts/git_cheat_sheet/</link><pubDate>Sat, 25 Dec 2021 01:31:18 +0800</pubDate><guid>https://songkou.github.io/posts/git_cheat_sheet/</guid><description>&lt;h2 id="git-cheat-sheet"&gt;Git cheat sheet&lt;/h2&gt;
&lt;h3 id="configure"&gt;Configure&lt;/h3&gt;
&lt;p&gt;Configure system/global level of current repository username, email&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global user.name &amp;quot;Jerry Mouse&amp;quot; 
git config --global user.email &amp;quot;jerry@yiibai.com&amp;quot;`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;List git configs&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --list 
git config -l`
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="initialize"&gt;initialize&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id="modify-commit"&gt;Modify commit&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;git add a.html 
git commit -m &amp;quot;提交文件a.html&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git revert&lt;/code&gt;- is about making a new commit that reverts the changes made by other commits.&lt;code&gt;git reset&lt;/code&gt; is about updating your branch, moving the tip in order to add or remove commits from the branch. This operation changes the commit history. it can also be used to restore the index, overlapping with git restore.&lt;code&gt;git-restore&lt;/code&gt; is about restoring files in the working tree from either the index or another commit. This command does not update your branch. The command can also be used to restore files in the index from another commit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Revert will reverse the changes from a commitment and is used mostly to undo faulty commits. This means that you can revert specific commits without affecting others. Revert works by making a new commit with the changes removed. You can revert any past commit. This can be the last commit, &lt;code&gt;$ git revert HEAD&lt;/code&gt;.&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>