Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = “[\d]{4}\/[01][\d]\/[0123][\d] [\d]{6}” ; match = re .search (pattn,text) .group()

加入好友
加入社群
Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

time= [‘Amplitude’, ”, ‘Test Time’, \
‘2022/08/30 073216’, ‘2022/08/30 073233’,\
‘2022/08/30 073250’, ‘2022/08/30 073307’,\
‘2022/08/30 073324’, ”, ‘Phase’, ”, ‘Test Time’,\
‘2022/08/30 073216’, ‘2022/08/30 073233’, \
‘2022/08/30 073250’, ‘2022/08/30 073307’,\
‘2022/08/30 073324’]

import re

text = ‘2022/08/30 073216
#fmt = r”????/??/?? ??????” #這個不行
#pattn = “[\d]{4}/[01][\d]/[0123][\d] [\d]{6}”

pattn = r”[\d]{4}\/[01][\d]\/[0123][\d] [\d]{6}”

“””

[\d]{4} : 2022  #4個數字

\/ : /

[01] : #0或1

[\d] : #1個數字

\/ : /

[0123] : #0 1 2 3 其中一個數字

[\d] :  #1個數字

[\d]{6} : 073216 #6個數字

 

前方多一個r可避免錯誤,此範例無差

月份01 02 … 09 10 11 12

月份的第一個數字不是0就是1 [01]

日期01 02 … 09 10 11… 20 21…30 31

日期的第一個數字

只有可能0 1 2 3 [0123]

#re寫得對不對,

#可以到regex101.com檢查

(直接按網站的複製鈕,反而前後會多贅字):

“””

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

正則表示法

[ ]內可以放兩類以上

但目前只放\d一類

有沒有[ ] 都沒差

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

match = re.search(pattn,text).group()

print(match)

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

本來希望if match != None

append進去list

但是None.group()會直接報錯: 

AttributeError: ‘NoneType’ object has no attribute ‘group’

 

應該這樣寫: 

time= ['Amplitude', '', 'Test Time', \
'2022/08/30 073216', '2022/08/30 073233',\
'2022/08/30 073250', '2022/08/30 073307',\
'2022/08/30 073324', '', 'Phase', '', 'Test Time',\
'2022/08/30 073216', '2022/08/30 073233', \
'2022/08/30 073250', '2022/08/30 073307',\
'2022/08/30 073324']
import re
#text = 'Amp'
#fmt = r"????/??/?? ??????" #這個不行
#pattn = "[\d]{4}/[01][\d]/[0123][\d] [\d]{6}"
pattn = "[\d]{4}\/[01][\d]\/[0123][\d] [\d]{6}"

timeNew = []
for t in time:
    text = t
    match = re.search(pattn,text)
    if match != None:
        timeNew.append(match.group())

#沒有.group() 回傳位置,若未搜尋到,回傳None

#有 .group()回傳搜尋到的內容
print(timeNew)

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

 

re這樣寫比較好理解一點:

[\d]{4}\/[\d]{2}\/[\d]{2} [\d]{6}

\/表示要搜尋/

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

regex101.com 的說明:

[\d]{4}\/[\d]{2}\/[\d]{2} [\d]{6}
 
 

Match a single character present in the list below

[\d]
{4} matches the previous token exactly 4 times
\d matches a digit (equivalent to [0-9])
\/ matches the character / with index 4710 (2F16 or 578) literally (case sensitive)
 

Match a single character present in the list below

[\d]
{2} matches the previous token exactly 2 times
\d matches a digit (equivalent to [0-9])
\/ matches the character / with index 4710 (2F16 or 578) literally (case sensitive)
 

Match a single character present in the list below

[\d]
{2} matches the previous token exactly 2 times
\d matches a digit (equivalent to [0-9])
 matches the character  with index 3210 (2016 or 408) literally (case sensitive)
 

Match a single character present in the list below

[\d]
{6} matches the previous token exactly 6 times
\d matches a digit (equivalent to [0-9])
 

Global pattern flags

g modifier: global. All matches (don’t return after first match)
m modifier: multi line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)
 
 

用findall做也可以

改成match != [] (原本是match != None)

time= ['Amplitude', '', 'Test Time', \
'2022/08/30 073216', '2022/08/30 073233',\
'2022/08/30 073250', '2022/08/30 073307',\
'2022/08/30 073324', '',\
'Phase', '', 'Test Time',\
'2022/08/30 073216', '2022/08/30 073233', \
'2022/08/30 073250', '2022/08/30 073307',\
'2022/08/30 073324']
import re
#text = 'Amp'
#fmt = r"????/??/?? ??????" #這個不行
#pattn = "[\d]{4}/[01][\d]/[0123][\d] [\d]{6}"
pattn = "[\d]{4}\/[01][\d]\/[0123][\d] [\d]{6}"
comp = re.compile(pattn,flags=0)
timeNew = []
for t in time:
    text = t
    match = re.findall(pattn,text)
    if match != []:
        timeNew.append(match)
print(timeNew)

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

findall回傳的是list

但我們只要string:

[item[0] for item in timeNew]

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

 

輸出結果:

Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

 

“””

pattn = r”[\d]{1,10000}”
# re最多只能10000,
# 再多一個0會出現Quantifier range is too large
# 比較長的檔案有7200點(數字出現4次)
# 10000綽綽有餘
“””
 
比較以下兩者
有無[] 的差別:
Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王
 
Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

在正则表达式中,方括号 [] 用于创建一个字符类(character class)或字符集合。
它指示正则表达式匹配方括号中的任何一个字符。

在字符类中,您可以列出要匹配的字符,或者使用特殊的字符类别简化模式。下面是一些常见的用法:

  1. 列出字符:例如,[abc] 匹配字符 “a”、”b” 或 “c”。

  2. 字符范围:您可以使用连字符 - 来指定一个字符范围。例如,[a-z] 匹配从小写字母 “a” 到 “z” 的任何字符。

  3. 反转字符类:您可以在字符类的开头使用 ^ 符号来反转匹配。例如,[^0-9] 匹配任何非数字字符。

  4. 字符类简写:正则表达式提供了一些常用字符类别的简写形式。例如,\d 表示数字字符,\w 表示任何字母数字字符及下划线 _,它等效于字符类 [a-zA-Z0-9_]\s 表示空白字符(包括空格、制表符等)。

  5. 组合使用:您可以组合多个字符类和其他正则表达式元素以创建更复杂的模式。例如,[a-zA-Z0-9] 匹配任何字母或数字字符。

请注意,字符类中的特殊字符(如 \- 等)可能需要进行转义,
具体取决于所使用的正则表达式引擎和上下文。
 
 
如果檔名如下:
Pattern_LinPol2_14.5GHz.png
想要依據.png的. 做split()
但是14.5的. 不要split()
如何做?
Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王
  1. \.: 这表示匹配一个点字符(.)。在正则表达式中,. 通常表示匹配除换行符外的任意字符。但是在这里,我们使用反斜杠进行转义,以匹配字面上的点字符。

  2. (?!\d): 这是一个负向前瞻断言(negative lookahead assertion)。它在匹配点字符后的位置进行检查,以确保后面不跟着一个数字。在这里,\d 表示匹配任意一个数字字符(0-9)。因此,(?!\d) 表示断言后面不跟着一个数字字符。

综合起来,正则表达式 \.(?!\d) 的含义是匹配一个点字符,并且后面不跟着一个数字字符。在文件名的上下文中,这样的正则表达式可以用来在文件扩展名的点字符处进行分割,而不会将包含小数点的数字分割开。

在正则表达式中,(?!...) 是一个负向前瞻断言(negative lookahead assertion),它用于限定匹配位置后面的内容。它断言括号内的模式在当前位置后面不出现。

这意味着 (?!...) 并不直接表示 “不等于” 的含义。它只是一个用于限制匹配的断言,用来排除某些模式的出现。

例如,正则表达式 apple(?!pie) 匹配 “apple”,但不匹配 “applepie”,因为断言后面不应该跟着 “pie”。

所以,(?!...) 在正则表达式中是用于限制匹配位置后面内容的模式。它并不直接表示 “不等于” 的含义,而是用来排除某些模式的出现

( )[ ] 在正则表达式中确实都涉及分组的概念,但它们的用途和含义略有不同。

  1. 捕获组 ( )

    • ( ) 用于创建一个捕获组,它可以将匹配的内容分组,并在后续的正则表达式中进行引用。
    • 捕获组可以用于提取特定部分的文本或进行后续处理。
    • 捕获组会记住它所匹配的内容,可以在后续的表达式中使用特殊字符 \1\2 等引用捕获到的内容。

    例如,正则表达式 (ab)+ 匹配连续出现的 “ab” 字符串,并将每个匹配的部分作为捕获组。 在字符串 “ababab” 中,整个正则表达式的匹配结果是 “ababab”,而捕获组的匹配结果是 “ab”。

    Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

  2. 字符类 [ ]

    • [ ] 用于创建一个字符类(character class)或字符集合,指示正则表达式匹配方括号中的任何一个字符。
    • 字符类可以列出要匹配的字符,或使用特殊字符类别简化模式。
    • 字符类匹配单个字符,而不是整个字符串或子字符串。

    例如,正则表达式 [abc] 匹配字符 “a”、”b” 或 “c”。 在字符串 “abc” 中,正则表达式的匹配结果是 “a”。

总结:

  • ( ) 用于创建捕获组,用于分组和引用匹配内容。
  • [ ] 用于创建字符类,用于指定匹配的字符集合。

虽然它们都有分组的概念,但 ( ) 更关注于匹配内容的分组和引用,而 [ ] 更关注于字符匹配的集合。

推薦hahow線上學習python: https://igrape.net/30afN

 

加入好友
加入社群
Python: Regular Expression 正規表示法 正則表達式 import re ; pattn = "[d]{4}/[01][d]/[0123][d] [d]{6}" ; match = re .search (pattn,text) .group() - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *