页面“Python正则”与“Shell数组”之间的差异

来自linux中国网wiki
(页面间的差异)
跳到导航 跳到搜索
docker>Evan
 
(导入1个版本)
 
第1行: 第1行:
regular expression
 
=base=
 
<pre>re_page = re.compile(r'<dd class="name">.*?<h2>(.*?)</h2>.*?<dd class="week">(.*?)</dd>.*?<span>.*?<b>(.*?)</b>(.*?)</span>',re.S)</pre>
 
  
()是为了提取匹配的字符串,表达式中有几个()就有几个相应的匹配字符串,想得到什么数据,就()起来 
+
==1定义==
 +
<pre>直接用圆括号包数组元素包起来,数组元素之间用空格隔开就行了,bash支持一维数组(不支持多维数组)
 +
定义数组的一般形式为:
 +
array_name=(value1 ... valuen)
 +
或者
 +
array_name=(
 +
value0
 +
value1
 +
value2
 +
value3
 +
)
  
详情请见[[Python获取天气并email通知]]
 
  
 +
evan@evanpc:~$ a=(1 2 3 4 5 )
 +
evan@evanpc:~$ echo $a
 +
</pre>
  
=group=
+
==2.数组读取与赋值==
 
<pre>
 
<pre>
In [14]: result=re.match(r"<h1>(.*)</h1>","<h1>匹配分组</h1>")
+
数组长度
 
+
用${#数组名[@或*]} 可以得到数组长度
112In [15]: result.group()
+
evan@evanpc:~$ echo ${#a[@]}
113Out[15]: '<h1>匹配分组</h1>'
+
5
 
 
115In [16]: result.group(1)
 
116Out[16]: '匹配分组'
 
 
 
118In [17]: result=re.match(r"(<h1>).*(</h1>)","<h1>匹配分组</h1>")
 
  
120In [18]: result.group(1)
+
读取:
121Out[18]: '<h1>'
 
In [19]: result.group(2)
 
124Out[19]: '</h1>'
 
  
126In [20]: result.group(0)
+
用${数组名[下标]} 下标是从0开始  下标是:*或者@ 得到整个数组内容
127Out[20]: '<h1>匹配分组</h1>'
 
  
129In [21]: result.group()
 
130Out[21]: '<h1>匹配分组</h1>'
 
  
groups
+
evan@evanpc:~$ echo ${a[0]}
In [22]: result.groups()
+
1
Out[22]: ('<h1>', '</h1>')
+
evan@evanpc:~$ echo ${a[2]}
 +
3
 +
evan@evanpc:~$ echo ${a[*]}
 +
1 2 3 4 5
  
In [23]: result.groups()[0]
 
Out[23]: '<h1>'
 
  
 +
赋值:
 +
直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
  
</pre>
 
  
=\num=
+
evan@evanpc:~$ a[1]=100
<pre>
+
evan@evanpc:~$ echo ${a[*]}
import re
+
1 100 3 4 5
 +
evan@evanpc:~$ a[6]=100
 +
evan@evanpc:~$ echo ${a[*]}
 +
1 100 3 4 5 100
  
In [25]: re.match(r"<.+><.+>.+</.+></.+>", s)
+
删除:
Out[25]: <re.Match object; span=(0, 26), match='<html><h1>itit</h1></html>'>
+
直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。
  
#2 对应第二个()的内容要一致 同理,1 也是同样道理 就不用像上面那样了,这个当时看书真的没理解完全呢 看了视频才比较爽了一些
+
evan@evanpc:~$ a=(1 2 3 4 5 )
In [28]: re.match(r"<(.+)><(.+)>.+</\2></\1>", s)
+
evan@evanpc:~$ unset a
Out[28]: <re.Match object; span=(0, 26), match='<html><h1>itit</h1></html>'>
+
evan@evanpc:~$ echo ${a[*]}
  
 +
evan@evanpc:~$ a=(1 2 3 4 5 )
 +
evan@evanpc:~$ unset a[1]
 +
evan@evanpc:~$ echo ${a[*]}
 +
1 3 4 5
 +
evan@evanpc:~$ echo ${#a[*]}
 +
4
 
</pre>
 
</pre>
 
+
==3.特殊使用==
=findall=
 
 
<pre>
 
<pre>
 +
分片:
 +
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,下面例子:c 就是一个新数据。
  
match 和 search 方法都是一次匹配,只要找到了一个匹配的结果就返回。然而,在大多数时候,我们需要搜索整个字符串,获得所有匹配的结果。
+
evan@evanpc:~$ a=(1 2 3 4 5 )
findall 方法的使用形式如下:
 
findall(string[, pos[, endpos]])
 
其中,string 是待匹配的字符串,pos 和 endpos 是可选参数,指定字符串的起始和终点位置,默认值分别是 0 和 len (字符串长度)。
 
 
 
findall 以列表形式返回全部能匹配的子串,如果没有匹配,则返回一个空列表。
 
看看例子:
 
 
 
首先是search
 
In [12]: s="linuxsa</h1></html>ops</h1>"
 
In [13]: re.search(r"\w+</h1>",s).group()
 
Out[13]: 'linuxsa</h1>'
 
 
 
这里是findall
 
n [15]: re.findall(r"\w+</h1>",s)
 
Out[15]: ['linuxsa</h1>', 'ops</h1>']
 
 
 
 
 
 
 
 
 
import re
 
pattern = re.compile(r'\d+')  # 查找数字
 
result1 = pattern.findall('hello 123456 789')
 
result2 = pattern.findall('one1two2three3four4', 0, 10)
 
 
print result1
 
print result2
 
执行结果:
 
['123456', '789']
 
['1', '2']
 
 
 
  
re.findall(pattern, string[, flags])
+
#从0 也就是第一个元素开始,切出3个元素
在字符串中找到正则表达式所匹配的所有子串,并组成一个列表返回。同样 RegexObject 有:
+
evan@evanpc:~$ echo ${a[@]:0:3}
findall(string[, pos[, endpos]])
+
1 2 3
  
\S 匹配任意非空字符
+
evan@evanpc:~$ echo ${a[@]:1:4}
 +
2 3 4 5
  
\w 匹配字母数字及下划线
+
evan@evanpc:~$ c=(${a[@]:1:4})
 +
evan@evanpc:~$ echo ${#c[@]}
 +
4
 +
evan@evanpc:~$ echo ${c[*]}
 +
2 3 4 5
  
\W 匹配非字母数字及下划线
 
  
 +
替换:
 +
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
  
 +
evan@evanpc:~$ a=(1 2 3 4 5 )
 +
evan@evanpc:~$ echo ${a[@]/3/100}
 +
1 2 100 4 5
 +
evan@evanpc:~$ echo ${a[@]}
 +
1 2 3 4 5
  
>>> import re 
+
evan@evanpc:~$ a=(${a[@]/5/500})
>>> s = "adfad asdfasdf asdfas asdfawef asd adsfas " 
+
evan@evanpc:~$ echo ${a[@]}
 
+
1 2 3 4 500
>>> reObj1 = re.compile('((\w+)\s+\w+)')  #小写
+
evan@evanpc:~$
>>> reObj1.findall(s) 
 
[('adfad asdfasdf', 'adfad'), ('asdfas asdfawef', 'asdfas'), ('asd adsfas', 'asd')]
 
  
  
In [9]: s = "a b c d  e f"
 
  
In [10]: reObj1 = re.compile('((\w+)\s+\w+)')
 
  
In [11]: reObj1.findall(s)
 
Out[11]: [('a b', 'a'), ('c d', 'c'), ('e f', 'e')]
 
  
#解说  当给出的正则表达式中带有多个括号时,列表的元素为多个字符串组成的tuple,tuple中字符串个数与括号对数相同,字符串内容与每个括号内的正则表达式相对应,并且排放顺序是按括号出现的顺序。
+
数组的遍历
  
 +
for data in ${array[@]} 
 +
do 
 +
    echo ${data} 
 +
done 
  
In [12]: reObj1 = re.compile('(\w+\s+\w+)')
 
  
In [13]: reObj1.findall(s)
+
tar czf ${codefilename} ${baklist_www[@]:0}  2>/dev/null
Out[13]: ['a b', 'c d', 'e f']
 
#当给出的正则表达式中带有一个括号时,列表的元素为字符串,此字符串的内容与括号中的正则表达式相对应(不是整个正则表达式的匹配内容)。
 
  
对于.re.compile.findall(data)之后的数据,我们可以通过list的offset索引或者str.join()函数来使之变成str字符串,从而进行方便的处理
 
 
</pre>
 
</pre>
  
[https://blog.csdn.net/drdairen/article/details/51134816 Python 正则re模块之compile()和findall()详解]
 
 
=sub=
 
 
 
 
=参考=
 
 
[[Re.search方法]]
 
 
[https://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html Python正则表达式指南]
 
 
[http://www.runoob.com/python/python-reg-expressions.html Python 正则表达式]
 
 
[https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonre/index.html ibm Python 正则表达式]
 
 
[http://wiki.jikexueyuan.com/project/python-crawler-guide/regular-expressions.html 正则表达式]
 
 
[https://blog.csdn.net/drdairen/article/details/51134816 Python 正则re模块之compile()和findall()详解]
 
 
[http://funhacks.net/2016/12/27/regular_expression/ Python 正则表达式 re 模块]
 
 
[https://www.jianshu.com/p/22ec752cf820 python,详说正则表达式(对常用的关键字符的讲解)]
 
 
[http://www.cnblogs.com/PythonHome/archive/2011/11/19/2255459.html Python之re模块 —— 正则表达式操作[原创]]
 
 
 
 
[http://www.jb51.net/article/15707.htm 比较详细Python正则表达式操作指南(re使用)]
 
 
[https://blog.csdn.net/suiyunonghen/article/details/3763261 Python正则表达式的几种匹配用法]
 
  
  
 +
http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html
 +
http://www.tldp.org/LDP/abs/html/
 +
http://c.biancheng.net/cpp/view/7002.html
  
 +
Shell 数组元素个数${#array[@]} 数组的所有元素${array[*]} 字符串长度${#str}
 +
http://zhenshi4597.blog.51cto.com/1891465/871166
  
[[category:python]]
+
[shell] shell数组(array)常用技巧学习实践(数据库备份脚本)
 +
http://bbs.linuxtone.org/thread-5317-1-1.html
 +
[[category:shell]]

2019年10月14日 (一) 13:52的版本

1定义

直接用圆括号包数组元素包起来,数组元素之间用空格隔开就行了,bash支持一维数组(不支持多维数组)
定义数组的一般形式为:
array_name=(value1 ... valuen)
或者
array_name=(
value0
value1
value2
value3
)


evan@evanpc:~$ a=(1 2 3 4 5 )
evan@evanpc:~$ echo $a

2.数组读取与赋值

数组长度
用${#数组名[@或*]} 可以得到数组长度
evan@evanpc:~$ echo ${#a[@]}
5

读取:

用${数组名[下标]} 下标是从0开始  下标是:*或者@ 得到整个数组内容


evan@evanpc:~$ echo ${a[0]}
1
evan@evanpc:~$ echo ${a[2]}
3
evan@evanpc:~$ echo ${a[*]}
1 2 3 4 5


赋值:
直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素


evan@evanpc:~$ a[1]=100
evan@evanpc:~$ echo ${a[*]}
1 100 3 4 5
evan@evanpc:~$ a[6]=100
evan@evanpc:~$ echo ${a[*]}
1 100 3 4 5 100

删除:
直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。

evan@evanpc:~$ a=(1 2 3 4 5 )
evan@evanpc:~$ unset a
evan@evanpc:~$ echo ${a[*]}

evan@evanpc:~$ a=(1 2 3 4 5 )
evan@evanpc:~$ unset a[1]
evan@evanpc:~$ echo ${a[*]}
1 3 4 5
evan@evanpc:~$ echo ${#a[*]}
4

3.特殊使用

分片:
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,下面例子:c 就是一个新数据。

evan@evanpc:~$ a=(1 2 3 4 5 )

#从0 也就是第一个元素开始,切出3个元素 
evan@evanpc:~$ echo ${a[@]:0:3}
1 2 3

evan@evanpc:~$ echo ${a[@]:1:4}
2 3 4 5

evan@evanpc:~$ c=(${a[@]:1:4})
evan@evanpc:~$ echo ${#c[@]}
4
evan@evanpc:~$ echo ${c[*]}
2 3 4 5


替换:
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。

evan@evanpc:~$ a=(1 2 3 4 5 )
evan@evanpc:~$ echo ${a[@]/3/100}
1 2 100 4 5
evan@evanpc:~$ echo ${a[@]}
1 2 3 4 5

evan@evanpc:~$ a=(${a[@]/5/500})
evan@evanpc:~$ echo ${a[@]}
1 2 3 4 500
evan@evanpc:~$ 





数组的遍历

for data in ${array[@]}  
do  
    echo ${data}  
done  


tar czf ${codefilename} ${baklist_www[@]:0}  2>/dev/null


http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html http://www.tldp.org/LDP/abs/html/ http://c.biancheng.net/cpp/view/7002.html

Shell 数组元素个数${#array[@]} 数组的所有元素${array[*]} 字符串长度${#str} http://zhenshi4597.blog.51cto.com/1891465/871166

[shell] shell数组(array)常用技巧学习实践(数据库备份脚本) http://bbs.linuxtone.org/thread-5317-1-1.html