文本处理 3.21
文本处理是什么?
通常情况下,我们作为设置服务器的,需要对客户端发送过来的文本文件进行解析/对数据进行验证(验证码)/对关键词进行提取(搜索引擎)/除去其他无关信息/对一些信息进行安全处理(扫黄?)/接收到的信息是否符合业务逻辑
正则判断
我想既然我不会设计正则表达式,那么我想让chatgpt帮我实现
嗯,我只是想一下
但其实还是要会一点点东西
不然那个机器人打出来我都看不懂
还是了解一下正则表达式的基本符号吧(可以结合例子来看,看那个太枯燥了)
-
匹配单个字符:
.
:匹配除换行符之外的任意单个字符。[abc]
:匹配字符集合中的任意一个字符,例如匹配a、b或c。
-
量词:
*
:匹配前面的字符零次或多次。+
:匹配前面的字符一次或多次。?
:匹配前面的字符零次或一次。{n}
:匹配前面的字符恰好n次。{n,}
:匹配前面的字符至少n次。{n,m}
:匹配前面的字符至少n次但不超过m次。
-
位置锚点:
^
:匹配输入字符串的开始位置。$
:匹配输入字符串的结束位置。
-
特殊字符转义:
\
:用于转义特殊字符,使其成为普通字符。例如,\.
匹配句点字符.
。
-
字符类别简写:
\d
:匹配数字字符,相当于[0-9]
。\w
:匹配单词字符(字母、数字、下划线),相当于[a-zA-Z0-9_]
。\s
:匹配空白字符(空格、制表符、换行符等)。\D
、\W
、\S
:分别是\d
、\w
、\s
的反义。
-
分组和捕获:
()
:用于创建捕获组,将匹配的内容分组。(?:)
:非捕获分组,不会存储匹配结果。
-
选择符:
|
:用于在多个模式之间选择匹配其中之一。
-
反义:
[^]
:匹配除括号中字符之外的任意一个字符。
-
其他常用语法:
*?
、+?
、??
:非贪婪匹配,尽可能少地匹配字符。\b
、\B
:单词边界和非单词边界。
常见的正则表达式:
1.匹配邮箱地址:
\w+@\w+\.\w+
\w+是用来匹配单个或多个字母,数字或下划线,也就是说
\w+
可以匹配字符串"19366566265safa_saf"。\w+
匹配一个或多个字母、数字或下划线字符,因此它能够匹配字符串中的数字、字母和下划线部分。
@用来匹配@符号
注意:正则表达式是一个整体,+不是用来连接的,而只是用来表明可以接收单个或多个(在原本的含义上)
2.匹配URL:
https?://\w+(\.\w+)+
?是用来表示匹配前面的字符(单个)零次或者一次,也就是协议只有两种https/http
通常一个域名
https://chat.openai.com/c/f378fb54-707b-4412-8123-540bb47735ad
https?://\w+(\.\w+)+(/.*)?
需要修改成这样
(/.*)?注意?之前是有个括号的,.表示匹配除了换行符以外的字符,*****表示多次
类似于这样子他会有很多个
3.匹配日期
\d{4}-\d{2}-\d{2}
我们可以观察到我们的日期的格式是
20040819
这个就不多解释了
4.匹配HTML标签
<[^>]+>
两边的< >是用来匹配<>这个不多说
\^\>\]是用来匹配除了\>的的任何字符,然后后面跟着一个+说明可以匹配很多 5.**匹配手机号码:** ```go regexCopy code 1[3-9]\d{9} ``` 这个正则表达式匹配中国大陆手机号码,其中`1`匹配手机号码的开头,`[3-9]`匹配第二位数字(3至9中的一个),`\d{9}`匹配后面的9位数字。 回归正题,我们来看一下go语言中regexp包,这个是和匹配正则表达式相关的 ```go func Match(pattern string, b []byte) (matched bool, error error) func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) func MatchString(pattern string, s string) (matched bool, error error) /* 三个输入源分别是byte slice,RuneReader,string patter就是输入源 */ ``` 下面我们来举个例子, ```go func IsIP(ip string) (b bool) { if m, _ := regexp.MatchString("^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$", ip); !m { return false } return true } ``` /*Pv4地址的范围是0.0.0.0到255.255.255.255 $表示结束 \\.这里查了chatgpt,就是说因为.本身表示的是匹配除了.之外的字符,但是我偏偏就需要匹配. 但是\\也是一个特殊字符,他不能单独使用,例如\\n对吧* 所以我们需要使用\\/ 这里我是在goLand上面进行了一个实验的,大家可以做一下,加强对这个函数的理解,代码不用全部打 ```go func main() { if len(os.Args) == 1 { fmt.Println("Usage: regexp [string]") os.Exit(1) } else if m, _ := regexp.MatchString("^[0-9]+$", os.Args[1]); m { fmt.Println("数字") } else { fmt.Println("不是数字") } } ``` 我一开始也没有弄懂os.Args什么意思,我是个小菜鸡 chatgpt回答: `os`包主要用于处理命令行参数和退出程序。 `os.Args` 是一个字符串切片,其中存储了命令行参数。`os.Args[0]` 存储了程序的名称,而后续的元素存储了传递给程序的命令行参数。 这个要做实验的话需要用到我们的终端(也就是cmd),不能直接使用run  **通过正则来获取内容** ```go package main import ( "fmt" "io/ioutil" "net/http" "regexp" "strings" ) func main() { resp, err := http.Get("http://www.baidu.com") if err != nil { fmt.Println("http get error.") } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("http read error") return } src := string(body) // 将 HTML 标签全转换成小写 re, _ := regexp.Compile("\\<[\\S\\s]+?\\>") src = re.ReplaceAllStringFunc(src, strings.ToLower) // 去除 STYLE re, _ = regexp.Compile("\\