元字符

\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
\w匹配字母或数字或下划线或汉字等。


常用的元字符
[table]
|代码|说明|
|.|匹配除换行符以外的任意字符|
|\w|匹配字母或数字或下划线或汉字|
|\s|匹配任意的空白符|
|\d|匹配数字|
|\b|匹配单词的开始或结束|
|^|匹配字符串的开始|
|$|匹配字符串的结束|
|n*|匹配任何包含零个或多个 n 的字符串|
[/table]

例子1:
((?=.*[0-9])(?=.*[a-zA-ZöÖäÄüÜß][\\!\\?\\$\\§@#*=]*)(?=[\\S]+$).{8,15})
长度在8到15之间
由至少一个数字和字母组成
字母包括变元音
可以有特殊字符"!,?,$,§,@,#,*,="
不能有空格

参见
[url]http://www.w3school.com.cn/js/jsref_obj_regexp.asp[/url]
<think>我们正在讨论Python re模块中的元字符元字符是正则表达式中具有特殊含义的字符。根据引用[4],元字符`[]`用于定义一个字符类(character class),即一组字符的集合。在字符类中,可以使用`-`表示范围,例如`[a-z]`表示所有小写字母。另外,引用[2]指出,在字符类中,`^`如果出现在第一个字符位置,则表示取反(即匹配不在该类中的字符);否则,它只是一个普通字符。 根据引用[1],在正则表达式中,反斜杠`\`是一个转义字符。但是在Python字符串中,反斜杠也是转义字符,因此要匹配一个字面上的反斜杠,需要四个反斜杠(`'c\\\\l'`)或者使用原始字符串(`r'c\\l'`)来避免双重转义。 引用[3]提到`re.search()`函数用于在字符串中查找第一个匹配,并返回一个匹配对象。 接下来,我将详细介绍re模块中常用的元字符: ### 1. 字符类元字符:`[]` - 用于定义一组字符,匹配其中任意一个字符。 - 例如:`[abc]`匹配`'a'`、`'b'`或`'c'`。 - 范围表示:`[a-z]`匹配任意小写字母。 - 特殊字符在`[]`中失去特殊意义,除了`^`、`-`和`\`。 - `^`在开头表示取反:`[^abc]`匹配除`a`、`b`、`c`外的任意字符(如引用[2]所示)。 - `-`在中间表示范围,如果放在开头或结尾则只是普通字符:`[-abc]`匹配`-`、`a`、`b`、`c`。 - `\`仍然作为转义字符。 ### 2. 转义元字符:`\` - 用于转义特殊字符,使其成为普通字符,例如:`\.`匹配点号(而不是任意字符)。 - 同时,`\`后接某些字符可表示特殊序列,例如: - `\d`匹配任意数字,等价于`[0-9]`。 - `\D`匹配非数字,等价于`[^0-9]`。 - `\s`匹配空白字符(空格、制表符、换行符等)。 - `\w`匹配字母、数字或下划线,等价于`[a-zA-Z0-9_]`。 ### 3. 位置元字符 - `^`:匹配字符串开头(在多行模式下也匹配行首)。 - `$`:匹配字符串结尾(在多行模式下也匹配行尾)。 ### 4. 数量词元字符 - `*`:匹配前一个字符0次或多次(贪婪模式)。 - `+`:匹配前一个字符1次或多次(贪婪模式)。 - `?`:匹配前一个字符0次或1次(贪婪模式),也可以使数量词变为非贪婪模式(在`*`、`+`、`?`、`{}`后加`?`)。 - `{m}`:匹配前一个字符m次。 - `{m,n}`:匹配前一个字符m到n次(贪婪模式)。 ### 5. 分组元字符:`()` - 将多个字符组合成一个单元,可对其应用数量词。 - 捕获分组:匹配的内容会被保存,可通过`group()`方法获取。 - 非捕获分组:`(?:...)`,不保存匹配内容。 ### 6. 选择元字符:`|` - 表示或,例如`a|b`匹配`'a'`或`'b'`。 ### 7. 点号:`.` - 匹配除换行符外的任意一个字符(在`re.DOTALL`模式下也可匹配换行符)。 ### 示例代码 ```python import re # 匹配以数字开头的字符串 print(re.match(r'^\d+', '123abc').group()) # '123' [^3] # 匹配邮箱(简化版) email_pattern = r'\w+@\w+\.\w+' print(re.search(email_pattern, '联系:abc@example.com').group()) # 'abc@example.com' [^3] # 使用分组提取日期 date_str = "2023-08-15" match = re.search(r'(\d{4})-(\d{2})-(\d{2})', date_str) if match: print(f"年: {match.group(1)}, 月: {match.group(2)}, 日: {match.group(3)}") # 输出:年:2023, 月:08, 日:15 # 非贪婪匹配 html = '<div>content1</div><div>content2</div>' non_greedy = re.findall(r'<div>(.*?)</div>', html) print(non_greedy) # ['content1', 'content2'] [^1] ``` ### 注意事项 1. 转义问题:在Python字符串中写正则表达式时,要注意转义。建议使用原始字符串(前缀`r`)以避免双重转义(如引用[1]所示)。 2. 特殊字符在字符类中的行为:在`[]`中,大多数元字符(如`.`、`*`、`+`)都会变成普通字符,但`^`、`-`和`\`需要特别注意位置和转义(如引用[2]和[4]所示)。 §§相关问题§§ 1. 如何在正则表达式中匹配字面字符`[`和`]`? 2. 如何理解正则表达式中的转义机制? 3. 非贪婪匹配有哪些常见应用场景? </think>### Python re模块元字符详解 元字符是正则表达式中具有特殊含义的字符,用于构建匹配规则。以下是核心元字符及其用法: #### 一、字符类元字符:`[ ]` 定义一组可选字符,匹配其中任意一个字符: ```python import re # 匹配元音字母 print(re.findall(r'[aeiou]', 'Python')) # ['o'] # 匹配范围(a-z小写字母) print(re.findall(r'[a-z]', 'PyThon')) # ['y', 'h', 'o', 'n'] # 匹配数字和字母 print(re.findall(r'[a-z0-9]', 'A1b2')) # ['1', 'b', '2'] ``` 特殊规则: 1. `^`在开头表示**取反**:`[^abc]`匹配除a/b/c外的字符(引用[2]) 2. `-`在中间表示范围,在首尾则作为普通字符 3. 元字符在`[]`内大多失去特殊含义(如`.`变为普通点) #### 二、转义元字符:`\` 用于匹配特殊字符的字面值或启用特殊序列: ```python # 匹配点号(非任意字符) print(re.search(r'\.', 'a.b').group()) # '.' # 匹配反斜杠(需双重转义或原始字符串) print(re.findall(r'c\\l', 'abc\le')) # ['c\\l'] (引用[1]) print(re.findall(r'c\\\\l', 'abc\le')) # ['c\\l'] ``` #### 三、位置锚定元字符 1. `^` - 匹配字符串**起始位置** ```python re.match(r'^Py', 'Python') # 匹配成功 ``` 2. `$` - 匹配字符串**结束位置** ```python re.search(r'on$', 'Python') # 匹配成功 ``` #### 四、数量限定元字符 1. `*` - 匹配前字符0次或多次 2. `+` - 匹配前字符1次或多次 3. `?` - 匹配前字符0次或1次 4. `{m,n}` - 匹配前字符m到n次 ```python # 匹配连续数字 print(re.findall(r'\d+', 'a123b45')) # ['123', '45'] ``` #### 五、特殊功能元字符 | 元字符 | 功能描述 | 示例 | |--------|------------------------------|--------------------------| | `.` | 匹配除换行符外任意字符 | `a.c` → "abc"、"a c" | | `|` | 或操作 | `cat|dog` → "cat"或"dog" | | `( )` | 定义捕获分组 | `(ab)+` → "abab" | | `(?: )`| 定义非捕获分组 | `(?:ab)+` → 不保存分组 | #### 六、预定义字符集缩写 | 序列 | 等价字符类 | 说明 | |------|-----------------|--------------------| | `\d` | `[0-9]` | 数字字符 | | `\D` | `[^0-9]` | 非数字字符 | | `\s` | `[ \t\n\r\f\v]` | 空白字符 | | `\S` | `[^ \t\n\r\f\v]`| 非空白字符 | | `\w` | `[a-zA-Z0-9_]` | 字母数字和下划线 | | `\W` | `[^a-zA-Z0-9_]` | 非单词字符 | #### 七、综合应用示例 ```python # 提取带区号的电话号码 text = "电话:(020)1234-5678, 手机:13800138000" pattern = r'\(?(\d{3,4})\)?[- ]?(\d{4})[- ]?(\d{4})' for match in re.finditer(pattern, text): print(f"号码: {''.join(match.groups())}, 分组: {match.groups()}") # 输出: # 号码: 02012345678, 分组: ('020', '1234', '5678') # 号码: 13800138000, 分组: ('1380', '0138', '000') ``` > **转义要点**:匹配字面元字符(如`[`、`(`)必须使用`\`转义。在Python字符串中,需双重转义或使用原始字符串(引用[1])。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值