### Python简单过滤字母和数字的方法详解
在Python编程中,经常需要处理文本数据,并从中提取特定类型的字符,比如仅保留字母或数字等。这在数据分析、文本处理等场景中非常常见。本文将详细介绍如何利用Python内置函数以及正则表达式来实现对字母和数字的过滤。
#### 一、使用内置函数过滤
Python提供了多种内置函数,可以轻松实现对字符串中字母和数字的过滤。这些内置函数包括`str.isdigit()`, `str.isalpha()` 和 `str.isalnum()` 等。
##### 1.1 只保留数字
```python
crazystring = 'dade142.!0142f[.,]ad'
# 只保留数字
new_crazy = filter(str.isdigit, crazystring)
print(''.join(list(new_crazy))) # 输出:1420142
```
在这个例子中,`str.isdigit` 方法用于判断一个字符是否为数字。`filter` 函数接受一个函数和一个序列作为参数,返回一个迭代器,该迭代器会过滤掉不符合条件的元素。这里使用 `list` 将迭代器转换为列表,再通过 `''.join()` 将列表中的所有元素连接成一个字符串。
##### 1.2 只保留字母
```python
# 只保留字母
new_crazy = filter(str.isalpha, crazystring)
print(''.join(list(new_crazy))) # 输出:dadefad
```
与上例类似,这里使用 `str.isalpha` 方法判断字符是否为字母。
##### 1.3 只保留字母和数字
```python
# 只保留字母和数字
new_crazy = filter(str.isalnum, crazystring)
print(''.join(list(new_crazy))) # 输出:dade1420142fad
```
`str.isalnum` 方法判断字符是否为字母或数字。
##### 1.4 保留数字和小数点
```python
# 如果想保留数字0-9和小数点'.'则需要自定义函数
new_crazy = filter(lambda ch: ch in '0123456789.', crazystring)
print(''.join(list(new_crazy))) # 输出:142.0142.
```
这里使用 `lambda` 表达式定义了一个匿名函数,用来判断字符是否为数字或小数点。
#### 二、使用正则表达式过滤
正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换等操作。下面介绍几种使用正则表达式过滤字母和数字的方法。
##### 2.1 过滤非字母开头的单词
```python
import re
L = ['小明', 'xiaohong', '12', 'adf12', '14']
for i in range(len(L)):
if re.findall(r'^[^\d]\w+', L[i]):
print(re.findall(r'^\w+$', L[i])[0])
```
这个例子中,正则表达式 `r'^[^\d]\w+'` 匹配以非数字开头的单词,而 `r'^\w+$'` 匹配整个单词。
##### 2.2 避开正则表达式
```python
L = ['xiaohong', '12', 'adf12', '14', '晓明']
for x in L:
try:
int(x)
except ValueError:
print(x)
```
这里通过尝试将每个元素转换为整数,如果失败,则认为该元素不是数字。
##### 2.3 使用 `isdigit` 方法
```python
L = ['xiaohong', '12', 'adf12', '14', '晓明']
for x in L:
if not x.isdigit():
print(x)
```
`isdigit` 方法检查字符串是否只包含数字。
#### 三、过滤特殊字符
在处理中文文本时,可能还需要过滤掉特殊符号、标点符号等。
```python
import re
x = 'a12121assa'
x = '1我们1'
r1 = r'[a-zA-Z0-9!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘'![\\]^_`{|}~]+'
print(re.sub(r1, '', x)) # 输出:我们
```
这里使用正则表达式 `r1` 来匹配并移除所有非中文字符。
#### 四、总结
通过上述示例,我们可以看到Python提供了多种方式来过滤字符串中的字母和数字。内置函数简单易用,适合快速原型开发;而正则表达式功能更加强大,可以处理更复杂的过滤需求。根据实际应用场景选择合适的方法,可以使代码更加高效和优雅。