正则表达式06-匹配分组

匹配分组

字符功能
|匹配左右任意一个表达式
(ab)将括号中字符作为一个分组
\num引用分组num匹配到的字符串
(?P<name>)分组起别名
(?P=name)引用别名为name分组匹配到的字符串

示例1:|

需求:匹配出0-100之间的数字

#coding=utf-8

import re

ret = re.match("[1-9]?\d","8")
print(ret.group())  # 8

ret = re.match("[1-9]?\d","78")
print(ret.group())  # 78

# 不正确的情况
ret = re.match("[1-9]?\d","08")
print(ret.group())  # 0

# 修正之后的
ret = re.match("[1-9]?\d$","08")
if ret:
    print(ret.group())
else:
    print("不在0-100之间")

# 添加|
ret = re.match("[1-9]?\d$|100","8")
print(ret.group())  # 8

ret = re.match("[1-9]?\d$|100","78")
print(ret.group())  # 78

ret = re.match("[1-9]?\d$|100","08")
# print(ret.group())  # 不是0-100之间

ret = re.match("[1-9]?\d$|100","100")
print(ret.group())  # 100

示例2:( )

需求:匹配出163、126、qq邮箱

#coding=utf-8

import re

ret = re.match("\w{4,20}@163\.com", "test@163.com")
print(ret.group())  # test@163.com

ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@126.com")
print(ret.group())  # test@126.com

ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@qq.com")
print(ret.group())  # test@qq.com

ret = re.match("\w{4,20}@(163|126|qq)\.com", "test@gmail.com")
if ret:
    print(ret.group())
else:
    print("不是163、126、qq邮箱")  # 不是163、126、qq邮箱

不是以4、7结尾的手机号码(11位)

import re

tels = ["13100001234", "18912344321", "10086", "18800007777"]

for tel in tels:
    ret = re.match("1\d{9}[0-35-68-9]", tel)
    if ret:
        print(ret.group())
    else:
        print("%s 不是想要的手机号" % tel)

提取区号和电话号码

>>> ret = re.match("([^-]*)-(\d+)","010-12345678")
>>> ret.group()
'010-12345678'
>>> ret.group(1)
'010'
>>> ret.group(2)
'12345678'

示例3:\

需求:匹配出<html>hh</html>

#coding=utf-8

import re

# 能够完成对正确的字符串的匹配
ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</html>")
print(ret.group())

# 如果遇到非正常的html格式字符串,匹配出错
ret = re.match("<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</htmlbalabala>")
print(ret.group())

# 正确的理解思路:如果在第一对<>中是什么,按理说在后面的那对<>中就应该是什么

# 通过引用分组中匹配到的数据即可,但是要注意是元字符串,即类似 r""这种格式
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
print(ret.group())

# 因为2对<>中的数据不一致,所以没有匹配出来
test_label = "<html>hh</htmlbalabala>"
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", test_label)
if ret:
    print(ret.group())
else:
    print("%s 这是一对不正确的标签" % test_label)

运行结果:

<html>hh</html>
<html>hh</htmlbalabala>
<html>hh</html>
<html>hh</htmlbalabala> 这是一对不正确的标签

示例4:\number

需求:匹配出<html><h1>www.itcast.cn</h1></html>

#coding=utf-8

import re

labels = ["<html><h1>www.itcast.cn</h1></html>", "<html><h1>www.itcast.cn</h2></html>"]

for label in labels:
    ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)

运行结果:

<html><h1>www.itcast.cn</h1></html> 是符合要求的标签
<html><h1>www.itcast.cn</h2></html> 不符合要求

示例5:(?P<name>) (?P=name)

需求:匹配出<html><h1>www.itcast.cn</h1></html>

#coding=utf-8

import re

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h1></html>")
ret.group()

ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.itcast.cn</h2></html>")
ret.group()

注意:(?P<name>)(?P=name)中的字母p大写

运行结果:

Traceback (most recent call list):

File "<stdin>", line 1, in <module>

AttributeError: 'None Type' object has no attribute 'group'
<think> 首先,用户的问题是:匹配50到100整数的正则表达式。用户明确表示要匹配50到100之间的整数,包括50和100。 从引用中,我有相关的正则表达式信息: - 引用[1]讨论了匹配整数和浮点数,但用户需要的是整数。 - 引用[3]讨论了匹配非负整数,包括避免前导零的问题。 - 引用[4]和[5]讨论了正整数的正则表达式,特别是引用[5]给出了一个匹配整数的正则表达式:^(0|-?[1-9]\\d*)$,这匹配整数包括0、正整数和负整数。 - 用户需要匹配50到100的整数,所以我需要调整这个范围。 用户的具体需求:匹配50到100的整数。这意味着: - 整数包括50, 51, ..., 100。 - 不包括小于50或大于100的数。 - 不包括小数或非数字。 正则表达式应该只匹配50到100之间的整数。 构建正则表达式- 数字范围:50到100。 - 这些是三位数或两位数:50到99是两位数,100是三位数。 - 所以,我需要处理: - 两位数:50到99。 - 三位数:100。 分解: - 匹配50到99:这可以表示为 [5-9][0-9],但[5-9][0-9]匹配50到99。 - 匹配100:直接是100。 - 所以,整体可以是 (5[0-9]|[6-9][0-9]|100) 或类似。 更精确: - 50到99:50-99可以表示为: - 50-59:5[0-9] - 60-99:[6-9][0-9] - 加上100:100 所以,组合起来: (5[0-9]|[6-9][0-9]|100) 但用户需要匹配整个字符串,所以应该使用锚点:^ 表示开始,$ 表示结束。 因此,正则表达式: ^(5[0-9]|[6-9][0-9]|100)$ 解释: - ^ 表示字符串开始 - (5[0-9]|[6-9][0-9]|100) 匹配- 5[0-9]:50-59 - [6-9][0-9]:60-99 - 100:100 - $ 表示字符串结束 这确保只匹配50到100的整数,没有其他字符。 从引用[5],有一个匹配整数的正则表达式,但用户需要特定范围,所以我应该基于需求定制。 用户提到“匹配50到100整数的正则表达式”,所以我需要提供这个正则表达式。 在回答中,我需要使用中文,因为系统指令说“使用中文回答”。 另外,系统指令要求: - 行内数学表达式用$...$,但这里没有数学表达式,主要是正则表达式- 独立公式用$$...$$,但正则表达式不是数学公式,所以可能不需要。 - LaTeX语法正确:正则表达式可以用代码块或直接写。 - 生成相关问题:在回答末尾添加相关问题。 - 回答中引用的段落末尾添加引用标识:我应引用相关的引用内容。 引用内容: - 引用[3]讨论了非负整数的匹配- 引用[5]讨论了整数的正则表达式。 在回答中,我应该引用这些来支持。 回答结构: 1. 先确认用户需求。 2. 提供正则表达式。 3. 解释正则表达式。 4. 给出示例或代码(如果需要)。 5. 添加相关问题。 相关问题:我应该生成2-3个相关问题,基于主题。 例如: 1. 如何匹配其他范围的整数? 2. 正则表达式匹配整数的常见陷阱? 3. 如何在特定编程语言中使用这个正则表达式? 系统指令说“生成相关问题”,并在示例中是“相关问题”。 现在,构建回答。 首先,正则表达式: ^(5[0-9]|[6-9][0-9]|100)$ 在文本中,我应该用代码块或反引号表示。 在用户消息中,有代码块,所以我可以用代码块。 在回答中,使用中文。 </think>### 匹配50到100整数的正则表达式 根据您的需求,您需要一个正则表达式匹配50到100之间的整数(包括50和100),例如50、75、100等,但排除小数、负数、超出范围的值以及前导零(如050或00100)。基于正则表达式的原理和相关引用,我将逐步解释并提供解决方案。 #### 正则表达式方案 核心正则表达式为: `^(5[0-9]|[6-9][0-9]|100)$` - **解释**: - `^` 表示字符串的开始,确保匹配从开头进行。 - `(5[0-9]|[6-9][0-9]|100)` 是一个分组匹配- `5[0-9]`:匹配50到59(例如50、59)。 - `[6-9][0-9]`:匹配60到99(例如60、99)。 - `100`:匹配100。 - `$` 表示字符串的结束,确保匹配到结尾,避免部分匹配(如1000)。 - 这个表达式覆盖了50到100的所有整数,且不匹配无效输入(如小数、负数或前导零),符合整数匹配的常见规范[^3][^5]。 - **为什么这个表达式有效?** - 它避免了前导零问题(如050会被排除),因为表达式直接匹配数字范围,不包含0开头的模式[^3]。 - 它基于整数的正则表达式原则,如引用[5]中所述的正则表达式 `^(0|-?[1-9]\\d*)$`,但针对50-100范围进行了优化,通过限制数字区间来精确匹配- 如果您需要在编程中使用,这个表达式是通用的,适用于Java、Python、JavaScript等语言(需根据语言调整转义字符)[^2]。 #### 示例代码(Python) 以下是一个Python示例,演示如何使用此正则表达式匹配字符串中的50-100整数: ```python import re def match_50_to_100(text): # 正则表达式匹配50-100的整数 pattern = r'^(5[0-9]|[6-9][0-9]|100)$' # 使用re.match检查整个字符串是否匹配 if re.match(pattern, text): return True else: return False # 测试示例 tests = ["50", "75", "100", "49", "101", "050", "100.0"] results = {num: match_50_to_100(num) for num in tests} print(results) # 输出: {'50': True, '75': True, '100': True, '49': False, '101': False, '050': False, '100.0': False} ``` - **说明**: - 这个函数 `match_50_to_100` 检查输入字符串是否完全匹配50-100的整数。 - 测试案例包括有效值(50、75、100)和无效值(49、101、050、100.0),结果只对有效值返回 `True`。 - 在代码中,正则表达式使用原始字符串 `r'...'` 避免转义问题。 #### 注意事项 - **边界处理**:这个表达式严格匹配整个字符串(使用 `^` 和 `$`),如果需要在文本中提取多个数字(如从句子中提取),可以改用 `re.findall`,但需调整表达式[^1]。 - **性能**:这个表达式高效,因为它使用简单的字符类,没有复杂回溯。 - **语言适配**:在Java等语言中,需转义反斜杠,例如:`String regex = "^(5[0-9]|[6-9][0-9]|100)$";`[^5]。 如果您有特定编程语言的需求(如Java或JavaScript),我可以提供更针对性的代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值