Skip to content

Commit 8fdb626

Browse files
added 32nd Python tip
1 parent e4830d8 commit 8fdb626

File tree

9 files changed

+89
-7
lines changed

9 files changed

+89
-7
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ I'm addicted to reading fantasy/sci-fi books, so I have a [blog](https://learnby
6969

7070
## Tips
7171

72+
* [Python tip 32: positive lookarounds](https://learnbyexample.github.io/tips/python-tip-32/)
7273
* [Vim tip 30: some general Vim settings](https://learnbyexample.github.io/tips/vim-tip-30/)
7374
* [CLI tip 31: concatenate files column wise](https://learnbyexample.github.io/tips/cli-tip-31/)
7475
* [Python tip 31: next() function](https://learnbyexample.github.io/tips/python-tip-31/)

Diff for: atom.xml

+50-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,57 @@
55
<link href="https://learnbyexample.github.io/atom.xml" rel="self" type="application/atom+xml"/>
66
<link href="https://learnbyexample.github.io"/>
77
<generator uri="https://www.getzola.org/">Zola</generator>
8-
<updated>2023-08-08T00:00:00+00:00</updated>
8+
<updated>2023-08-16T00:00:00+00:00</updated>
99
<id>https://learnbyexample.github.io/atom.xml</id>
10+
<entry xml:lang="en">
11+
<title>Python tip 32: positive lookarounds</title>
12+
<published>2023-08-16T00:00:00+00:00</published>
13+
<updated>2023-08-16T00:00:00+00:00</updated>
14+
<link rel="alternate" href="https://learnbyexample.github.io/tips/python-tip-32/" type="text/html"/>
15+
<id>https://learnbyexample.github.io/tips/python-tip-32/</id>
16+
<content type="html">&lt;p&gt;Lookarounds help to create custom anchors and add conditions within a regex definition. These assertions are also known as &lt;strong&gt;zero-width patterns&lt;&#x2F;strong&gt; because they add restrictions similar to anchors and are not part of the matched portions. Negative lookarounds were discussed in &lt;a href=&quot;https:&#x2F;&#x2F;learnbyexample.github.io&#x2F;tips&#x2F;python-tip-29&#x2F;&quot;&gt;this post&lt;&#x2F;a&gt;. The syntax for positive lookarounds is shown below:&lt;&#x2F;p&gt;
17+
&lt;ul&gt;
18+
&lt;li&gt;&lt;code&gt;(?=pat)&lt;&#x2F;code&gt; positive lookahead assertion&lt;&#x2F;li&gt;
19+
&lt;li&gt;&lt;code&gt;(?&amp;lt;=pat)&lt;&#x2F;code&gt; positive lookbehind assertion&lt;&#x2F;li&gt;
20+
&lt;&#x2F;ul&gt;
21+
&lt;p&gt;Here are some examples:&lt;&#x2F;p&gt;
22+
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#f5f5f5;color:#1f1f1f;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;42 apple-5, fig3; x-83, y-20: f12&amp;#39;
23+
&lt;&#x2F;span&gt;&lt;span&gt;
24+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# extract digits only if it is followed by ,
25+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# note that end of string doesn&amp;#39;t qualify as this is a positive assertion
26+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;findall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;,)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, s)
27+
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;5&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;83&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]
28+
&lt;&#x2F;span&gt;&lt;span&gt;
29+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# extract digits only if it is preceded by - and followed by ; or :
30+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;findall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;-)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?=[:;]&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, s)
31+
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;20&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]
32+
&lt;&#x2F;span&gt;&lt;span&gt;
33+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# replace &amp;#39;par&amp;#39; as long as &amp;#39;part&amp;#39; occurs as a whole word later in the line
34+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;sub&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;par(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?=.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;*\b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;part&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;\b&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;[&lt;&#x2F;span&gt;&lt;span style=&quot;text-decoration:underline;font-style:italic;color:#d2a8a1;&quot;&gt;\g&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;lt;0&amp;gt;]&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;par spare part party&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)
35+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;[par] s[par]e part party&amp;#39;
36+
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
37+
&lt;p&gt;With lookbehind assertion (both positive and negative), the pattern used for the assertion cannot &lt;em&gt;imply&lt;&#x2F;em&gt; matching variable length of text. Fixed length quantifier is allowed. Different length alternations are not allowed, even if the individual alternations are of fixed length.&lt;&#x2F;p&gt;
38+
&lt;pre data-lang=&quot;python&quot; style=&quot;background-color:#f5f5f5;color:#1f1f1f;&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;= &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;pore42 tar3 dare7 care5&amp;#39;
39+
&lt;&#x2F;span&gt;&lt;span&gt;
40+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# not allowed
41+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;findall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;dare)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, s)
42+
&lt;&#x2F;span&gt;&lt;span&gt;re.error: look&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;behind requires fixed&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;width pattern
43+
&lt;&#x2F;span&gt;&lt;span&gt;
44+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# workaround for r&amp;#39;(?&amp;lt;!tar|dare)\d+&amp;#39;
45+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;findall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;tar)(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;dare)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, s)
46+
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;42&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;5&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]
47+
&lt;&#x2F;span&gt;&lt;span&gt;
48+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# workaround for r&amp;#39;(?&amp;lt;=tar|dare)\d+&amp;#39;
49+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span&gt;re.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;findall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#668f14;&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(?:(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;tar)&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;?&amp;lt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7c8f4c;&quot;&gt;dare))&lt;&#x2F;span&gt;&lt;span style=&quot;color:#aeb52b;&quot;&gt;\d&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, s)
50+
&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;3&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;7&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]
51+
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
52+
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;info.svg&quot; alt=&quot;info&quot; &#x2F;&gt; The third-party &lt;code&gt;regex&lt;&#x2F;code&gt; module (&lt;a href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;regex&#x2F;&quot;&gt;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;regex&#x2F;&lt;&#x2F;a&gt;) offers advanced features like variable-length lookbehinds, subexpression calls, etc.&lt;&#x2F;p&gt;
53+
&lt;p&gt;&lt;strong&gt;Video demo&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
54+
&lt;p align=&quot;center&quot;&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; loading=&quot;lazy&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Bu27WS-GExk&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;&lt;&#x2F;p&gt;
55+
&lt;br&gt;
56+
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;info.svg&quot; alt=&quot;info&quot; &#x2F;&gt; See also my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;learnbyexample&#x2F;100_page_python_intro&quot;&gt;100 Page Python Intro&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;learnbyexample&#x2F;py_regular_expressions&quot;&gt;Understanding Python re(gex)?&lt;&#x2F;a&gt; ebooks.&lt;&#x2F;p&gt;
57+
</content>
58+
</entry>
1059
<entry xml:lang="en">
1160
<title>Vim tip 30: some general Vim settings</title>
1261
<published>2023-08-08T00:00:00+00:00</published>

Diff for: sitemap.xml

+5-1
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@
435435
</url>
436436
<url>
437437
<loc>https://learnbyexample.github.io/tips/</loc>
438-
<lastmod>2023-08-08</lastmod>
438+
<lastmod>2023-08-16</lastmod>
439439
</url>
440440
<url>
441441
<loc>https://learnbyexample.github.io/tips/cli-tip-1/</loc>
@@ -661,6 +661,10 @@
661661
<loc>https://learnbyexample.github.io/tips/python-tip-31/</loc>
662662
<lastmod>2023-07-25</lastmod>
663663
</url>
664+
<url>
665+
<loc>https://learnbyexample.github.io/tips/python-tip-32/</loc>
666+
<lastmod>2023-08-16</lastmod>
667+
</url>
664668
<url>
665669
<loc>https://learnbyexample.github.io/tips/python-tip-4/</loc>
666670
<lastmod>2022-06-10</lastmod>

0 commit comments

Comments
 (0)