2019年12月18日 星期三

CentOS 8 正式版發布


轉自 https://www.ithome.com/0/447/093.htm

CentOS 8 正式版發布

2019/9/25 11:14:34 來源:開源中國作者:紅薯責編:騎士評論:175
CentOS 8 官方正式發布了。CentOS完全遵守Red Hat的再發行政策,並且致力與上游產品在功能上完全兼容。CentOS對組件的修改主要是去除Red Hat的商標及美工圖。
該版本還包含全新的CentOS Streams,Centos Stream是一個滾動發布的Linux發行版,它介於Fedora Linux的上游開發和RHEL的下游開發之間而存在。你可以把CentOS Streams當成是用來體驗最新紅帽系Linux特性的一個版本,而無需等太久。
CentOS 8主要改動和RedHat Enterprise Linux 8 是一致的,基於Fedora 28和內核版本4.18,為用戶提供一個穩定的、安全的、一致的基礎,跨越混合雲部署,支持傳統和新興的工作負載所需的工具。此次發布的亮點包括:
發行版
  • 通過 BaseOS 和應用流(AppStream)倉庫發布.
  • AppStream 是對傳統rpm格式的全新擴展,為一個組件同時提供多個主要版本
軟件管理
  • YUM 包管理器基於 DNF 技術,提供模塊化內容支持,增強了性能,並且提供了設計良好的API用於與其他工具集成
Shell和命令行工具
RHEL 8提供了版本控制工具: Git 2.18, Mercurial 4.8,和 Subversion 1.10.
動態編程語言、Web和數據庫服務器
  • Python 3.6 是默認的Python環境,有限支持Python 2.7
  • Node.js 是在RHEL最新包含的,其他動態語言更新包括: PHP 7.2, Ruby 2.5, Perl 5.26, SWIG 3.0
  • RHEL 8提供的數據庫服務包括:MariaDB 10.3, MySQL 8.0, PostgreSQL 10, PostgreSQL 9.6,和 Redis 5.
  • RHEL 8提供Apache HTTP Server 2.4 以及首次引入的, nginx 1.14.
  • Squid 版本升級到4.4,同時也首次提供Varnish Cache 6.0.
桌面環境
  • GNOME Shell 升級到3.28.
  • GNOME會話和顯示管理使用 Wayland 作為默認的顯示服務器,而RHEL 7默認的 X.Org server依然提供
詳細信息請看  Section 5.1.8,“Desktop”
安裝程序以及鏡像的創建
  • Anaconda 安裝程序可使用 LUKS2 磁盤加密,支持 NVDIMM 設備.
  • Image Builder 工具可以創建不同格式的自定義系統鏡像,包括滿足雲平台的各種格式
  • 支持使用硬件管理控制台HMC從DVD安裝,同時也提供IBM Z主機的 Support Element (SE)
內核
  • 擴展Berkeley Packet Filtering (eBPF) 特性使得用戶空間的各個點上附加自定義程序,包括(sockets, trace points, packet reception),用於接收和處理數據。目前該特性還處於特性預覽階段
  • BPF Compiler Collection (BCC),這是一個用來創建高效內核跟踪和操作的工具,目前處於技術預覽階段
文件系統和存儲
  • LUKS version 2 (LUKS2)格式替代舊的 LUKS (LUKS1)格式. dm-crypt 子系統和 cryptsetup 工具現在使用LUKS2作為默認的加密卷格式
安全
  • 默認的系統級的 加密策略,用於配置核心加密子系統,覆蓋TLS, IPsec, SSH, DNSSEC,和Kerberos協議。增加全新命令update-crypto-policies,管理員可以輕鬆切換不同模式:default, legacy, future,和fips.
  • 支持智能卡和硬件安全模塊 (HSM)的 PKCS #11
詳細介紹請看  Section 5.1.15,“Security”
網絡
  • nftables 框架替代 iptables 作為默認的網絡包過濾工具
  • firewalld 守護進程使用 nftables 作為默認後端
  • 支持 IPVLAN 虛擬網絡驅動程序,用於連接多個容器
  • eXpress Data Path (XDP), XDP for Traffic Control (tc),以及Address Family eXpress Data Path (AF_XDP),可作為部分Berkeley Packet Filtering (eBPF)擴展特性,目前還是技術預覽階段,詳情請看  Section 5.3.7 ,“Networking” .
詳細的網絡方面的特性請看 Section 5.1.14,“Networking”  .
虛擬化
  • 在RHEL8中創建的虛擬機中,現在支持並自動配置更現代的基於PCI Express的計算機類型(Q35)。這在虛擬設備的功能和兼容性方面提供了多種改進。
  • 現在可以使用RHEL8Web控制台(也稱為“駕駛艙”)創建和管理虛擬機。
  • qemu仿真器引入了沙箱功能,它為系統調用qemu可以執行的操作提供了可配置的限制,從而使虛擬機更加安全。
編譯器和開發工具
  • GCC 編譯器更新到8.2版本,支持更多C++標準,更好的優化以及代碼增強技術、提升警告和硬件特性支持
  • 不同的代碼生成、操作和調試工具現在可以處理 DWARF5 調試信息格式(體驗階段)
  • 核心支持 eBPF 調試的工具包括BCC, PCP,和 SystemTap.
  • glibc 庫升級到2.28支持 Unicode 11,更新的Linux系統調用,關鍵提升主要在DNS stub resolver、額外的安全加強和性能提升
  • RHEL 8提供OpenJDK 11, OpenJDK 8, IcedTea-Web,以及不同 Java 工具,如 Ant, Maven,或 Scala.
高可用和集群
  • Pacemaker 集群資源管理器更新到最新版本2.0.0,修復了一系列bug以及功能做了提升
  • pcs 配置系統完全支持Corosync 3, knet,和節點名稱

2019年11月6日 星期三

Cloud Text-to-Speech 參數調整

https://cloud.google.com/text-to-speech/?hl=zh-tw
Cloud Text-to-Speech 參數調整
Speed:0.70     Pitch:2.40
Interactive Voice Response (IVR) system


2019年11月5日 星期二

ip=(172.3.5.253 172.2.3.218); i=0; sshpass -p 'xxxxx' ssh script@${ip[i]} "df"




~$ ip=(172.3.5.253 172.2.3.218)
~$ i=0
~$ sshpass -p 'xxxxx' ssh script@${ip[i]} "df" 

Filesystem                                      1K-blocks             Used Available               Use% Mounted on
/dev/sda5                                           28383388        27058616                  0       100%    /
tmpfs                                                    8179912                     0      8179912           0%    /dev/shm
/dev/sda1                                               495844             37701         432543           9%    /boot
/dev/sda2                                         196103540           191800   185950268          1%     /check1
/dev/sda6                                         309633052       79641308   214263308         28%    /fs
/dev/mapper/pccp1                        1691041148      13152724 1591988472            1%    /pcc
/dev/mapper/cs_pccp1                     206428012          354900   195587088           1%     /cs_pcc
/dev/mapper/v3calllogp1                 206428012          191760   195750228            1%    /v3_pcc
/dev/mapper/bscbkupp1                  774090456    223767640    511001324          31%    /bsc
/dev/mapper/checkp1                      516068876    417485652      72368360          86%    /check
/dev/mapper/fsp1                            309633052      79641308    214263308          28%    /fs
/dev/mapper/publicnewp1               206428012    157188692     38753296          81%     /public
/dev/mapper/sharenewp1                516068876    182631524    307222488          38%    /share
~$

--------------------------------------------------------------------------------------------------------------------
~$ SAESideIP=(172.2.3.219 172.2.3.218)
~$ i=0
~$ sshpass -p 'xxxxx' ssh script@${SAESideIP[i]} "df"

Filesystem           1K-blocks            Used Available                        Use% Mounted on
/dev/sda5             28383388         15725768   11215828                         59% /


eval用法 eval SAENameAx=\${SAENameA$(($i+1))[j]}




  • eval:

  • 語法
    [test @test test]# eval variable
    例題:
    [test @test test]# days=365
    [test @test test]# year=days
    [test @test test]# echo \$$year
    $days  <==第一個 $ 被 \ 改變成為一般字元,而 \$ 後面接的 $year 就成為 days 啦!
    [test @test test]# eval echo \$$year
    365
    加上 eval 之後, \$$year 變成的 $days 的『變數內容』會顯現出來喔!
    這個指令也是頗有趣的!他主要是用來做為變數的『疊代』用的!以上面的例子來看,起先, \$$year 會變成為 $days ,而這個 $days 其實是一般字元喔!並不是變數!不過,加上了 eval 之後,這個字串就會被變成變數內容咯!所以說, eval 是用來做為『二次疊代』的功能的!
           上述資料來自 http://linux.vbird.org/linux_basic/0320bash/0320bash.php



1. ~$ name=yawu
    ~$ echo $name
    ~$ yawu

2. ~$ yawu=vmd
    ~$ echo $name
    ~$ yawu

    ~$ eval echo \$$name
    ~$ vmd

3. ~$ eval echo "$""$name"
    ~$ vmd
 
or

    ~$ eval echo '${'"$name"'}'
    ~$ vmd


链接:https://www.jianshu.com/p/284ae3a0244e



-------------------------------------------------------------------------------------------------------------------------

for ((i=0; i < 2; i++)); do
for ((j=0; j < 3; j++)); do
# ii=$(($i+1))
                # eval SAENameAx=\${SAENameA${ii}[j]}
eval SAENameAx=\${SAENameA$(($i+1))[j]}
                echo "SAENameAx="$SAENameAx
PathFileName=$(echo $Path/${SAESide[i]}/${SAEDir[j]}/${SAENameAx}"-"$SearchDATE"-task.txt")
                echo "PathFileName= "$PathFileName
The_number_of_lines_in_a_file=$(cat $PathFileName |grep -n 'HKT 2019'| wc -l)
echo "The number of lines in a file="$The_number_of_lines_in_a_file
cat ${PathFileName} |grep -n 'HKT 2019' > $Path/tempA_${i}_${j}.txt
for ((k=1; k < $The_number_of_lines_in_a_file; k++)); do
    Paragraph_begin=$(cat $Path/tempA_${i}_${j}.txt | sed -n "${k}p" | awk 'BEGIN {FS=":"}; END{print $1}')
Paragraph_begin=$(($Paragraph_begin+5))

k=$(($k+1))
Paragraph_end=$(cat $Path/tempA_${i}_${j}.txt | sed -n "${k}p" | awk 'BEGIN {FS=":"}; END{print $1}')
Paragraph_end=$(($Paragraph_end-2))

cat ${PathFileName} |sed -n "${Paragraph_begin},${Paragraph_end}p" > $Path/tempB_${i}_${j}.txt
done
done

done

2019年11月1日 星期五

Linux 的 scp 指令用法教學與範例:遠端加密複製檔案與目錄


Linux 的 scp 指令用法教學與範例:遠端加密複製檔案與目錄

這裡介紹如何在 Linux 系統上以 scp 指令複製檔案與目錄,並提供一些參考範例。
若要在不同的 Linux 主機之間複製檔案,最常用的方法就是使用 scp 指令,它可以透過 SSH 安全加密傳輸的方式,將本地端的檔案或目錄複製到遠端,或是將遠端的資料複製到本地端,而這個指令在 Mac OS X 中也同樣可以使用。
在不同 Linux 主機之間使用 scp 指令複製檔案時,遠端的 Linux 主機必須要開啟 SSH 遠端登入服務,否則無法使用 scp 指令複製檔案。

複製檔案與目錄

scp 指令的語法跟一般的 cp 類似,只不過 scp 可以在不同的 Linux 主機之間複製檔案,其語法為:
scp [帳號@來源主機]:來源檔案 [帳號@目的主機]:目的檔案
這裡的帳號就是登入主機上的帳號(類似 ssh 指令的用法),如果省略帳號與主機,只寫一般的檔案路徑的話,就是代表本機的檔案。
例如將本地端的 /path/file1 複製到 192.168.0.1 這台主機上的 /path/file2,而登入 192.168.0.1 這台主機時,是以 myuser 這個帳號登入:
# 從本地端複製到遠端
scp /path/file1 myuser@192.168.0.1:/path/file2
也可以把遠端的檔案複製到本地端:
# 從遠端複製到本地端
scp myuser@192.168.0.1:/path/file2 /path/file1
這樣就會用 myuser 這個帳號登入 192.168.0.1,將遠端主機上的 /path/file2 複製到 /path/file1
如果本地端的使用者帳號名稱剛好跟遠端的使用者帳號一樣,也可以將使用者帳號省略,例如:
# 從本地端複製到遠端
scp /path/file1 192.168.0.1:/path/file2
反過來也是類似:
# 從遠端複製到本地端
scp 192.168.0.1:/path/file2 /path/file1

複製目錄

若要複製整個目錄以及其下的所有檔案,則加上 -r 參數:
# 複製目錄
scp -r /path/folder1 myuser@192.168.0.1:/path/folder2

保留檔案時間與權限

若要讓檔案在複製之後,還可保留原本的修改時間、存取時間與權限,可以加上 -p 參數:
# 保留檔案時間與權限
scp -p /path/file1 myuser@192.168.0.1:/path/file2

資料壓縮

若要將資料壓縮之後再傳送,減少網路頻寬的使用量,可以加上 -C 參數:
# 資料壓縮
scp -C /path/file1 myuser@192.168.0.1:/path/file2

限制傳輸速度

若要限制網路的使用頻寬,可以用 -l 指定可用的網路頻寬上限值(單位為 Kbit/s):
# 限制傳輸速度為 400 Kbit/s
scp -l 400 /path/file1 myuser@192.168.0.1:/path/file2
這樣就會限制 scp 只能使用 400 Kbit/s,也就是 400 / 8 = 50 KB/s。

自訂連接埠

一般 SSH 伺服器的連接埠號為 22,如果遇到使用非標準埠號的伺服器,可以用 -P 來指定埠號。若遠端的 SSH 伺服器使用 2222 這個連接埠,我們就可以這樣複製檔案:
# 使用 2222 連接埠
scp -P 2222 /path/file1 myuser@192.168.0.1:/path/file2

IPv4 與 IPv6

-4 與 -6 兩個參數分別可以讓 scp 使用 IPv4 與 IPv6 來傳輸資料:
# 使用 IPv4
scp -4 /path/file1 myuser@192.168.0.1:/path/file2

# 使用 IPv6
scp -6 /path/file1 myuser@192.168.0.1:/path/file2

2019年10月30日 星期三

[Ubuntu] 自動掛載 NAS 網路磁碟機 (samba)

轉自
https://blog.ladsai.com/ubuntu-%E8%87%AA%E5%8B%95%E6%8E%9B%E8%BC%89-nas-%E7%B6%B2%E8%B7%AF%E7%A3%81%E7%A2%9F%E6%A9%9F-samba.html



Ubuntu 18.04
首先建立一個要空資料

2019年10月29日 星期二

https://www.runoob.com/python3/python3-reg-expressions.html

Python3 正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
本章节主要介绍 Python 中常用的正则表达式处理函数,如果你对正则表达式不了解,可以查看我们的 正则表达式 - 教程

re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法
re.match(pattern, string, flags=0)
函数参数说明:
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例

#!/usr/bin/python import re print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配
以上实例运行输出结果为:
(0, 3)
None

实例

#!/usr/bin/python3 import re line = "Cats are smarter than dogs" # .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符 matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) if matchObj: print ("matchObj.group() : ", matchObj.group()) print ("matchObj.group(1) : ", matchObj.group(1)) print ("matchObj.group(2) : ", matchObj.group(2)) else: print ("No match!!")
以上实例执行结果如下:
matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
函数参数说明:
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志
匹配成功re.search方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

实例

#!/usr/bin/python3 import re print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
以上实例运行输出结果为:
(0, 3)
(11, 14)

实例

#!/usr/bin/python3 import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) if searchObj: print ("searchObj.group() : ", searchObj.group()) print ("searchObj.group(1) : ", searchObj.group(1)) print ("searchObj.group(2) : ", searchObj.group(2)) else: print ("Nothing found!!")
以上实例执行结果如下:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

实例

#!/usr/bin/python3 import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj: print ("match --> matchObj.group() : ", matchObj.group()) else: print ("No match!!") matchObj = re.search( r'dogs', line, re.M|re.I) if matchObj: print ("search --> matchObj.group() : ", matchObj.group()) else: print ("No match!!")
以上实例运行结果如下:
No match!!
search --> matchObj.group() :  dogs

检索和替换

Python 的re模块提供了re.sub用于替换字符串中的匹配项。
语法:
re.sub(pattern, repl, string, count=0, flags=0)
参数:
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。
前三个为必选参数,后两个为可选参数。

实例

#!/usr/bin/python3 import re phone = "2004-959-559 # 这是一个电话号码" # 删除注释 num = re.sub(r'#.*$', "", phone) print ("电话号码 : ", num) # 移除非数字的内容 num = re.sub(r'\D', "", phone) print ("电话号码 : ", num)
以上实例执行结果如下:
电话号码 :  2004-959-559 
电话号码 :  2004959559

repl 参数是一个函数

以下实例中将字符串中的匹配的数字乘于 2:

实例

#!/usr/bin/python import re # 将匹配的数字乘于 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))
执行输出结果为:
A46G8HFD1134

compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:
re.compile(pattern[, flags])
参数:
  • pattern : 一个字符串形式的正则表达式
  • flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
    • re.I 忽略大小写
    • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
    • re.M 多行模式
    • re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
    • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
    • re.X 为了增加可读性,忽略空格和' # '后面的注释

实例

实例

>>>import re >>> pattern = re.compile(r'\d+') # 用于匹配至少一个数字 >>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配 >>> print m None >>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配 >>> print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> >>> m.group(0) # 可省略 0 '12' >>> m.start(0) # 可省略 0 3 >>> m.end(0) # 可省略 0 5 >>> m.span(0) # 可省略 0 (3, 5)
在上面,当匹配成功时返回一个 Match 对象,其中:
  • group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0)
  • start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;
  • end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;
  • span([group]) 方法返回 (start(group), end(group))
再看看一个例子:

实例

>>>import re >>> pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写 >>> m = pattern.match('Hello World Wide Web') >>> print m # 匹配成功,返回一个 Match 对象 <_sre.SRE_Match object at 0x10bea83e8> >>> m.group(0) # 返回匹配成功的整个子串 'Hello World' >>> m.span(0) # 返回匹配成功的整个子串的索引 (0, 11) >>> m.group(1) # 返回第一个分组匹配成功的子串 'Hello' >>> m.span(1) # 返回第一个分组匹配成功的子串的索引 (0, 5) >>> m.group(2) # 返回第二个分组匹配成功的子串 'World' >>> m.span(2) # 返回第二个分组匹配成功的子串索引 (6, 11) >>> m.groups() # 等价于 (m.group(1), m.group(2), ...) ('Hello', 'World') >>> m.group(3) # 不存在第三个分组 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: no such group

findall

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
re.findall(string[, pos[, endpos]])
参数:
  • string 待匹配的字符串。
  • pos 可选参数,指定字符串的起始位置,默认为 0。
  • endpos 可选参数,指定字符串的结束位置,默认为字符串的长度。
查找字符串中的所有数字:

实例

import re pattern = re.compile(r'\d+') # 查找数字 result1 = pattern.findall('runoob 123 google 456') result2 = pattern.findall('run88oob123google456', 0, 10) print(result1) print(result2)
输出结果:
['123', '456']
['88', '12']

re.finditer

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
re.finditer(pattern, string, flags=0)
参数:
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

实例

import re it = re.finditer(r"\d+","12a32bc43jf3") for match in it: print (match.group() )
输出结果:
12 
32 
43 
3

re.split

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])
参数:
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
maxsplit分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

实例

>>>import re >>> re.split('\W+', 'runoob, runoob, runoob.') ['runoob', 'runoob', 'runoob', ''] >>> re.split('(\W+)', ' runoob, runoob, runoob.') ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''] >>> re.split('\W+', ' runoob, runoob, runoob.', 1) ['', 'runoob, runoob, runoob.'] >>> re.split('a*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割 ['hello world']

正则表达式对象

re.RegexObject

re.compile() 返回 RegexObject 对象。

re.MatchObject

group() 返回被 RE 匹配的字符串。
  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 \\t )匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
模式描述
^匹配字符串的开头
$匹配字符串的末尾。
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*匹配0个或多个的表达式。
re+匹配1个或多个的表达式。
re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}匹配n个前面表达式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o。
re{ n,}精确匹配n个前面表达式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。
re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b匹配a或b
(re)匹配括号内的表达式,也表示一个组
(?imx)正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)类似 (...), 但是不表示一个组
(?imx: re)在括号中使用i, m, 或 x 可选标志
(?-imx: re)在括号中不使用i, m, 或 x 可选标志
(?#...)注释.
(?= re)前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功。
(?> re)匹配的独立模式,省去回溯。
\w匹配数字字母下划线
\W匹配非数字字母下划线
\s匹配任意空白字符,等价于 [\t\n\r\f]。
\S匹配任意非空字符
\d匹配任意数字,等价于 [0-9]。
\D匹配任意非数字
\A匹配字符串开始
\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z匹配字符串结束
\G匹配最后匹配完成的位置。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等。匹配一个换行符。匹配一个制表符, 等
\1...\9匹配第n个分组的内容。
\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

正则表达式实例

字符匹配

实例描述
python匹配 "python".

字符类

实例描述
[Pp]ython匹配 "Python" 或 "python"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于 [0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了数字外的字符

特殊字符类

实例描述
.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。