正则表达式匹配排列

正则表达式与平衡组
  前几天有位同事问到这方面的问题,当前首先想到的是用平衡组,不过平衡组的例了主要用于匹配嵌套的Html标签,在网上查了一下,也没这方面的资料,不过这个问题最终还是通过平衡组解决了
  先来看全排列了,假如有元素A,B,C,由这三个元素组成的组成的全排列为ABC,ACB,BAC,BCA,CAB,CBA六种,显然用[A-C]{3}这样的正则表达式是不对的,因为这样会匹配像AAA, ABB这样的排列,当然你可以通过或运算符将所有的排列列出来,正则表达式如下(ABC|ACB|BAC|BCA|CAB|CBA),这是没有问题的,但是如果有4个元素,就有24排列,如果有5个元素,有120种排列,用这种方法就不太现实了,如果改用平衡组来实现,就简单多了,对A,B,C三个元素,正则表达式如下:
  (?'A')(?'B')(?'C')((?'-A'A)|(?'-B'B)|(?'-C'C)){3}( ?(A)(?!))(?(B)(?!))(?(C)(?!))
  首先往栈中放入三个名称为A, B, C的三个分组,注意由于这三个分组不匹配任何内容
  接着当匹配元素A时,将名称为A的分组从栈中移除,当匹配元素B是,将名称为B的分组从栈中移除,当匹配元素C时,将名称为C的分组从栈中移除,{3}指定只匹配3个元素
  最后检查栈中是否还有名称为A,B,C的分组,如果有,则匹配失败。
  OK,全排列搞定了,下面来看部分排列了,假如有A,B,C,D四个元素,取两个元素的排列为AB,AC,AD,BD,BA,BC,BD,CA,CB,CD,DA,DB,DC,共是12种,当然用或运算符讲12种情况列出来是没问题,正则表在式就不写了,如果取三个元素呢,就有24种情况了,显然通过这种方式不够灵活了,通过平衡组,这个问题一样可以解决,正则表达式如下:
  (?'item'){2}(?'-item'[A-D]){2}(?(item)(?!))
  先往栈中压入2个名为item的分组,这两个分组不匹配如何元素
  接着当匹配到A,B,C,D中的任何一个元素,从栈中移除一个item分组,{2}保证只匹配两个元素
  最后检查栈中是否还有item分组,有则匹配失败
  C#的测试代码如下: string input = "AB"; //string input = "AA"; string pattern = @"(?'item'){2}(?'-item'[A-D]){2}(?(item)(?!))"; Match match = Regex.Match(input, pattern); if (match.Success) { Console.WriteLine(match.Value); }
在Python爬虫中,正则表达式用于匹配Cookie可参考以下方法。首先要了解正则表达式的基本元素,其描述了字符串排列的一套规则,包含原子、元字符等内容。 原子有普通字符、非打印字符、通用字符等形式,还有原子表 `[]` 等。比如原子表 `[xyz]py` 能从源字符串 `xpython` 中匹配出 `xpy`;`[^xyz]py` 则能匹配 `apy` 但不能匹配 `xpy` [^1]。 元字符方面,有任意匹配元字符 `.` (匹配除换行符以外的任意字符)、边界限定元字符 `^`(匹配字符串的开始)和 `$`(匹配字符串的结束)、限定符、模式选择符、模式单元符等 [^1]。 在Python里,可使用 `re` 模块进行正则匹配,常见函数有: - `re.match` 函数:从起始位置匹配一个模式 [^1]。 - `re.search` 函数:在字符串中搜索匹配的模式。 - `re.findall` 函数:找到所有匹配的子字符串。 - `re.sub` 函数:用于替换匹配的子字符串 [^1]。 以匹配Cookie中的特定字段为例,假设要匹配Cookie中 `token` 字段的值,可参考如下代码: ```python import re # 假设这是获取到的Cookie字符串 cookie_str = "token=12345; other_field=value" # 定义正则表达式模式 pattern = r'token=(\d+)' # 使用re.search查找匹配项 match = re.search(pattern, cookie_str) if match: # 获取匹配的值 token_value = match.group(1) print(f"匹配到的token值为: {token_value}") ``` 此代码运用正则表达式 `token=(\d+)` 匹配 `token` 字段的值,其中 `\d+` 表示匹配任意数字,`()` 用于捕获匹配的内容。借助 `re.search` 函数查找匹配项,若找到则使用 `group(1)` 方法获取捕获的内容 [^3]。 在使用正则表达式时,还需留意数量词的贪婪模式与非贪婪模式。Python里数量词默认是贪婪的,会尝试匹配尽可能多的字符;非贪婪的则尝试匹配尽可能少的字符。一般使用非贪婪模式来提取信息。同时,正则表达式里使用 `\` 作为转义字符,Python的原生字符串可解决反斜杠困扰,例如匹配一个数字的 `\\d` 可写成 `r'\d'` [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值