天天看点

数字匹配和字符串匹配

筛选list里元素是python经常面临的问题之一,其中元素又主要分为“数字”和“字母”,下面就分别说一下如何筛选list里的元素。

筛选序列中的数字元素

1

2

3

4

5

<code>&gt;&gt;&gt; aaa</code><code>=</code><code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>-</code><code>6</code><code>,</code><code>-</code><code>7</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>9</code><code>,</code><code>0</code><code>]</code>

<code>&gt;&gt;&gt; [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&gt;</code><code>0</code><code>] </code><code>#提取所有大于零的数</code>

<code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>]</code>

<code>&gt;&gt;&gt; [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&lt;</code><code>=</code><code>0</code><code>] </code><code>#提取所有小于等于零的数</code>

<code>[</code><code>-</code><code>6</code><code>,</code><code>-</code><code>7</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>9</code><code>,</code><code>0</code><code>]</code>

这样得到的是一个list,如果想要得到一个int,那就

<code>&gt;&gt;&gt; bbb</code><code>=</code><code>[num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&gt;</code><code>0</code><code>]</code>

<code>&gt;&gt;&gt; </code><code>for</code> <code>i </code><code>in</code> <code>bbb:</code>

<code>        </code><code>print</code><code>(i)</code>

i就是int。

使用shell通配符进行字母匹配

筛选字母就要用到fnmatch模块,这个模块可以让python认可类似linux的正则表达式。fnmatch模块不仅在3.5好使,在2.6也是自带的。

6

7

8

9

10

11

12

<code>&gt;&gt;&gt; </code><code>import</code> <code>fnmatch</code>

<code>&gt;&gt;&gt; a</code><code>=</code><code>[</code><code>"james"</code><code>,</code><code>"wade"</code><code>,</code><code>"yaoming"</code><code>,</code><code>"kevin"</code><code>,</code><code>"rose"</code><code>,</code><code>"kobe"</code><code>]</code>

<code>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"james"</code><code>)    </code><code>#完全匹配a字符串里的james</code>

<code>[</code><code>'james'</code><code>]</code>

<code>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"*e"</code><code>)    </code><code>#匹配a字符串里以e结尾的单词</code>

<code>[</code><code>'wade'</code><code>, </code><code>'rose'</code><code>, </code><code>'kobe'</code><code>]</code>

<code>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"*[en]"</code><code>)    </code><code>#匹配a字符串里以e or n结尾的单词</code>

<code>[</code><code>'wade'</code><code>, </code><code>'kevin'</code><code>, </code><code>'rose'</code><code>, </code><code>'kobe'</code><code>] </code>

<code>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"*![en]"</code><code>)      </code><code>#错误用法  </code>

<code>[] </code>

<code>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"*[!en]"</code><code>)    </code><code>#匹配a字符串里不是以e or n结尾的单词</code>

<code>[</code><code>'james'</code><code>, </code><code>'yaoming'</code><code>]</code>

这里要注意,这里要用import fnmatch,而不是from fnmatch import fnmatch.如果启用了from fnmatch import fnmatch,会提示AttributeError: 'function' object has no attribute 'filter'。

如果用的是类似数字的方法[name for name in a if fnmatch(a,"*e")],会提示:TypeError: normcase() argument must be str or bytes, not 'list'。

如果把a转成str,又提示:AttributeError: 'function' object has no attribute 'filters'。不过有的书说这个方法是好使的,我的机器却不成功,不知道为什么。

如果是数字与字母混搭...

假设aaa=[1,2,3,4,5,"messi","pique","N/A',"-"],要提取所有的数字的话,可以这么写一个小函数。

13

14

<code>&gt;&gt;&gt; aaa</code><code>=</code><code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>"messi"</code><code>,</code><code>"pique"</code><code>,</code><code>"N/A"</code><code>,</code><code>"xavi"</code><code>]</code>

<code>&gt;&gt;&gt; </code><code>def</code> <code>check_int(x):</code>

<code>    </code><code>try</code><code>:</code>

<code>        </code><code>num</code><code>=</code><code>int</code><code>(x)    </code><code>#int就是挑出数字的关键词</code>

<code>        </code><code>print</code><code>(num)</code>

<code>    </code><code>except</code> <code>ValueError:</code>

<code>        </code><code>return</code> <code>False</code>

<code>    </code> 

<code>&gt;&gt;&gt; nums</code><code>=</code><code>list</code><code>(</code><code>filter</code><code>(check_int,aaa))</code>

<code>1</code>

<code>2</code>

<code>3</code>

<code>4</code>

<code>5</code>

这里单独说一下filter函数的用法,filter()里面要有两个参数,一个是定义的函数,另一个是函数作用的list。这两个参数都是必须的,缺一不可。

再举一个例子来说明一下filter()。

<code>&gt;&gt;&gt; aaa</code><code>=</code><code>[</code><code>10</code><code>,</code><code>99</code><code>,</code><code>25</code><code>,</code><code>6</code><code>,</code><code>7</code><code>,</code><code>784</code><code>,</code><code>"格里芬"</code><code>,</code><code>"圣骑士"</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>34</code><code>,</code><code>0</code><code>]</code>

<code>&gt;&gt;&gt; </code><code>def</code> <code>guolvhanshu(x):</code>

<code>        </code><code>if</code> <code>x&lt;</code><code>10</code> <code>and</code> <code>x&gt;</code><code>5</code>

<code>            </code><code>return</code><code>(x)</code>

<code>&gt;&gt;&gt; result</code><code>=</code><code>filter</code><code>(guolvhanshu,aaa)    </code><code>#使用 filter函数,里面的参数是guolvhanshu和aaa</code>

<code>&gt;&gt;&gt; </code><code>list</code><code>(result)        </code><code>#如果是python2.6,可以直接print result</code>

<code>    </code><code>[</code><code>6</code><code>,</code><code>7</code><code>]</code>

不熟悉python 3.5的迭代器可以看:http://zhidao.baidu.com/link?url=5ONk1itSIxSv9C9E506oV04NJPSs6LY0Atz0YZujd9gsE5_MBxmcsRp7gB2AimDF7UHJXngAOetzcRnh3bGbn7tZJtR_jjMPBPhQJ6mpwrq

 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1767197