Unverified Commit 01b8452f authored by Kiryuu's avatar Kiryuu
Browse files

:)

parent 793f4f25
# python正则表达式综合练习
> 本实训旨在检验你是否掌握正则常用方法的使用,赶紧来挑战吧!
https://www.educoder.net/shixuns/pbvjhm8z/challenges
## 第1关:提取日志内容
### 任务描述
本关任务:使用Python正则提取日志内容。
### 编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:
- 编写正则表达式提取日志中 `cs_item_sk` 的数值以1结尾的并且布尔值为 true 的日志内容,然后打印匹配到的日志内容。其中文件输入路径为:`./test_one/src.txt`
文件中的部分内容如下所示:
```
[main] INFO com.jzdata.press.core.PressTest - select
cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =13
group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100;
true 291
[main] INFO com.jzdata.press.core.PressTest - select
cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =111
group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100;
true 320
[main] INFO com.jzdata.press.core.PressTest - select
cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =312
group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100;
true 320
```
以上内容匹配到的日志内容为 `('111', '320')`
### 测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
预期输出:
`('111', '320')`
----
开始你的任务吧,祝你成功!
### 答案
```python
import re
def re_Regex():
#*********** Begin **********#
# 读取数据文件
pattern = re.compile(r'^\[.+cs_item_sk\s*=(\d*1)\D.+?true\s*(\d+)', re.DOTALL)
with open('./test_one/src.txt') as f:
for span in pattern.findall(''.join(f.readlines())):
print(span)
# 根据日志数据编写正则表达式提取数据内容
# 提取cs_item_sk的数值以1结尾的并且布尔值为true的所需的日志内容
#*********** End **********#
```
## 第2关:组合密码匹配
### 任务描述
本关任务:编写正则获取一组密码中的正确密码。
### 编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,正确密码的具体要求如下:
- 正确密码包括数字,字母,特殊字符;
- 包含空格,换行,制表符等空字符的密码无效;
- 密码不能为纯数字,纯字母,纯特殊字符。
### 测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:
```python
abc123@., good123...,666educoder^,hello123@123456789
```
预期输出:
```python
['abc123@.', '666educoder^', 'hello123@']
```
注意在文件 `stepm2.py` 中,测试数据被处理为以下格式:
```python
"""
abc123@.
good123...
666educoder^
hello123@
123456789
"""
```
----
开始你的任务吧,祝你成功!
### 答案
```python
import re
def re_test2(input_data):
result=[]
#*********** Begin **********#
result = []
pattern1 = re.compile(r"^\S+$")
pattern2 = re.compile(r"^\d+$")
pattern3 = re.compile(r"^\w+$")
pattern4 = re.compile(r"^\W+$")
for line in input_data.split('\n'):
if pattern1.match(line) is not None \
and pattern2.match(line) is None \
and pattern3.match(line) is None \
and pattern4.match(line) is None:
result.append(line)
return result
#*********** End **********#
return result
```
## 第3关:网页内容解析
### 任务描述
本关任务:使用python正则解析网页内容。
### 编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体说明如下:
1. `parse_one_page()` 函数传入参数 html 为网页源代码;
2. 根据网页源代码提取电影信息,并打印匹配到的结果。获取内容格式如下:
`board-index ***`(排名)、`date-src`(图片地址)、`title`(影片名)、 `star`(主演)、`releasetime`(上映时间)、`integer``fraction` (评分 如:`9.5` `integer:9.` `fraction:5`)标签组合。
参考 html 文本:
```html
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">主演:张国荣,张丰毅,巩俐</p>
<p class="releasetime">上映时间:1993-01-01</p>
</div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div>
</div>
</div>
</dd>
```
### 测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:
`./test_three/霸王别姬.html`
预期输出:
```python
[('1','https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', '霸王别姬', '主演:张国荣,张丰毅,巩俐', '上映时间:1993-01-01', '9.', '5')]
```
----
开始你的任务吧,祝你成功!
### 答案
> 我吐了
```python
import re
def parse_one_page(string):
#*********** Begin **********#
result = []
result += re.findall(r'<i class="board-index.*?">([^<]+)', string),
result += re.findall(r'<img data-src="([^"]+)', string),
result += re.findall(r'<a .*?title="([^"]+)', string),
result += re.findall(r'<p class="star">\s*([^<\s]+)', string),
result += re.findall(r'<p class="releasetime">\s*([^<\s]+)', string),
result += re.findall(r'<i class="integer">\s*([^<\s]+)', string),
result += re.findall(r'<i class="fraction">\s*([^<\s]+)', string),
print(list(map(tuple, zip(*result))))
#*********** End **********#
```
\ No newline at end of file
import numpy as np
with open('./test_one/Test.py',"r",encoding="utf8") as f:
code = f.read()
hash_name = list("1320")
hash_count = [0]*len(hash_name)
for i, name in enumerate(hash_name):
if name in code:
hash_count[i] = 1
if np.array(hash_count).sum() == 4:
print('切勿投机取巧!')
else:
import Test
Test.re_Regex()
\ No newline at end of file
import re
def re_Regex():
#*********** Begin **********#
# 读取数据文件
# 根据日志数据编写正则表达式提取数据内容
# 提取cs_item_sk的数值以1结尾的并且布尔值为true的所需的日志内容
#*********** End **********#
[main] INFO com.jzdata.press.core.PressTest - select cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =2 group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100; true 2640
[main] INFO com.jzdata.press.core.PressTest - select cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =16 group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100; true 282
[main] INFO com.jzdata.press.core.PressTest - select cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =13 group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100; true 291
[main] INFO com.jzdata.press.core.PressTest - select cs_bill_customer_sk,count(*) from catalog_sales where cs_item_sk =111 group by cs_bill_customer_sk order by cs_bill_customer_sk limit 100; true 320
\ No newline at end of file
import Test
html = input()
with open(html,"r",encoding="utf8") as f:
Test.parse_one_page(f.read())
import re
def parse_one_page(html):
#*********** Begin **********#
#*********** End **********#
<dd>
<i class="board-index board-index-3">3</i>
<a href="/films/2641" title="罗马假日" class="image-link" data-act="boarditem-click" data-val="{movieId:2641}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p0.meituan.net/movie/289f98ceaa8a0ae737d3dc01cd05ab052213631.jpg@160w_220h_1e_1c" alt="罗马假日" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/2641" title="罗马假日" data-act="boarditem-click" data-val="{movieId:2641}">罗马假日</a></p>
<p class="star">
主演:格利高里·派克,奥黛丽·赫本,埃迪·艾伯特
</p>
<p class="releasetime">上映时间:1953-09-02(美国)</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">1</i></p>
</div>
</div>
</div>
</dd>
\ No newline at end of file
<dd>
<i class="board-index board-index-2">2</i>
<a href="/films/1297" title="肖申克的救赎" class="image-link" data-act="boarditem-click" data-val="{movieId:1297}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c" alt="肖申克的救赎" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1297" title="肖申克的救赎" data-act="boarditem-click" data-val="{movieId:1297}">肖申克的救赎</a></p>
<p class="star">
主演:蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿
</p>
<p class="releasetime">上映时间:1994-09-10(加拿大)</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div>
</div>
</div>
</dd>
\ No newline at end of file
<dd>
<i class="board-index board-index-1">1</i>
<a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
<img src="//s3plus.meituan.net/v1/mss_e2821d7f0cfe4ac1bf9202ecf9590e67/cdn-prod/file:5788b470/image/loading_2.e3d934bf.png" alt="" class="poster-default" />
<img data-src="https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王别姬" class="board-img" />
</a>
<div class="board-item-main">
<div class="board-item-content">
<div class="movie-item-info">
<p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p>
<p class="star">
主演:张国荣,张丰毅,巩俐
</p>
<p class="releasetime">上映时间:1993-01-01</p> </div>
<div class="movie-item-number score-num">
<p class="score"><i class="integer">9.</i><i class="fraction">5</i></p>
</div>
</div>
</div>
</dd>
\ No newline at end of file
import re
def re_test2(input_data):
result=[]
#*********** Begin **********#
#*********** End **********#
return result
\ No newline at end of file
import step2
if __name__ == '__main__':
str = ""
a = input()
for i in a.split(","):
str += "\n"
str += i
print(step2.re_test2(str))
\ No newline at end of file
# Python正则表达式进阶
> 正则表达式在实际应用中,可以匹配非常复杂的字符串,但是需要使用到它更加高级的用法。
>
> 本实训主要介绍:
> - 正则表达式分组
> - 正则表达式断言
> - 正则表达式标记
> - 正则表达式编译
https://www.educoder.net/shixuns/6538mi2v/challenges
## 第1关:分组
### 任务描述
本关任务:使用分组完成对中国手机号码的提取
### 相关知识
#### 分组
要实现分组很简单,使用()即可。从正则表达式的左边开始看,看到的第一个左括号(表示表示第一个分组,第二个表示第二个分组,依次类推。
```python
a='<div><a href="https://support.google.com/chrome/?p=ui_hotword_search" target="_blank">python正则表达式之分组</a><p>dfsl</p></div>'
print(re.search(r'<a.*>(.*)</a>',a).group(1))
```
输出:
`python正则表达式之分组`
*需要注意的是,有一个隐含的全局分组(就是索引号为0的分组),就是整个正则表达式匹配的结果。*
#### 命名分组
命名分组就是给具体有默认分组编号的组另外再起一个别名,方便以后的引用。
命令分组的语法格式如下:
`(?P<name>正则表达式)`
语法格式中的字符 `P` 必须是大写的 `P``name` 是一个合法的标识符,表示分组的别名。如下例子:
```python
a = "ip='127.0.0.1',version='1.0.0'"
res = re.search(r"ip='(?P<ip>\d+\.\d+\.\d+\.\d+).*", a)
print(res.group('ip')) #通过命名分组引用分组
```
输出:
`127.0.0.1`
### 编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:
- 提取11位数字的手机号码,过滤掉字符串中其他符号。
### 测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
输入:
```
(86)-17712576838,86 14295083635,(+86) 13722348123,17587918887,-15493106739,.13786842977,86-15542304386,+86.15642387356,17345352790
```
经过 Python 文件 stepm.py 处理为以下格式:
```python
"""
(86)-17712576838
86 14295083635
(+86) 13722348123
17587918887
-15493106739
.13786842977
86-15542304386
+86.15642387356
17345352790"""
```
你将使用以上格式的数据完成任务!
预期输出:
```python
['17712576838', '14295083635', '13722348123', '17587918887', '15493106739', '13786842977', '15542304386', '15642387356', '17345352790']
```
---
开始你的任务吧,祝你成功!
### 答案
```python
import re
def re_group(input_data):
return [span.group(0) for span in re.finditer(r'1\d{10}', input_data)]
```
## 第2关:先行断言
### 任务描述
本关任务:编写正则表达式,使用正向先行断言获取字符串中以ing结尾的字符(不能为空)。
### 相关知识
先行断言分为正向先行断言和反向先行断言,完成本关任务需要了解这两个知识点。
#### 正向先行断言
`(?=pattern)` 表示正向先行断言,整个括号里的内容(包括括号本身)代表字符串中的一个位置,紧接该位置之后的字符序列能够匹配pattern。举个例子:
```python
# `(?!e)`代表字符串中的一个位置,紧接该位置之后的字符序列只能够匹配`e`。
a = re.findall(r'n(?=al)','final')
b = re.findall(r'n(?=e)','python')
c = re.findall(r'n(?=e)','jasmine')
print(a)
print(b)
print(c)
```
输出:
```python
['n']
[]
['n']
```
#### 反向先行断言
`(?!pattern)` 表示反向先行断言,与正向先行断言相反,紧接该位置之后的字符序列不能够匹配 `pattern`。同样举个例子:
```python
a = re.findall(r'n(?!e)','final')
b = re.findall(r'n(?!e)','python')
c = re.findall(r'n(?!e)','next')
print(a)
print(b)
print(c)
```
输出:
```python
['n']
['n']
[]
```
**注意:反向断言不支持匹配不定长的表达式,也就是说 `+`、`*` 字符不适用于反向断言的前后**
### 编程要求
请根据相关知识补充右侧Begin-End之间的代码,并完成下列任务:
- 使用正向先行断言获取字符串中以ing结尾的字符(不能为空)。
### 测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:`I am singing while you are dancing`
预期输出:`['sing', 'danc']`
----
开始你的任务吧,祝你成功!
### 答案
```python
import re
a = input()
#*********** Begin **********#
result = re.findall(r'\S+(?<=\S)(?=ing)(?!inging)', a)
#*********** End **********#
print(result)
```
## 第3关:后发断言
### 任务描述
本关任务:编写正则表达式,使用正向后发断言获取字符串中以 go 开头的字符的后半部分。
### 相关知识
后行断言分为**正向后发断言****反向后发断言**,完成本关需要掌握这两个知识点。
#### 正向后发断言
`(?<=pattern)` 正向后发断言代表字符串中的一个位置,紧接该位置之前的字符序列只能够匹配 `pattern`
```python
a = re.findall('(?<=a)n','final')
b = re.findall('(?<=a)n','command')
c = re.findall('(?<=i)n','negative')
print(a)
print(b)
print(c)
```
输出:
```python
[]
['n']
[]
```
#### 反向后发断言
`(?<!pattern)` 负向后发断言 代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配 `pattern`
```python
a = re.findall('(?<!i)n','final')
b = re.findall('(?<!a)n','command')
c = re.findall('(?<!i)n','negative')
print(a)
print(b)
print(c)
```
输出:
```python
[]
[]<