簡體   English   中英

python中的正則表達式不起作用

[英]Regular Expression in python doesn't work

我正在寫《 Python for Informatics 》一書中的練習,該書要求我編寫一個程序來模擬grep命令在UNIX上的操作。 但是,我的代碼不起作用。 在這里,我簡化了代碼,僅打算計算以“查找”一詞開頭的行數。 我很困惑,希望您能對此有所啟發。

from urllib.request import urlopen
import re

fhand = urlopen('http://www.py4inf.com/code/mbox-short.txt')
sumFind = 0

for line in fhand:
    line = str(line) #convert from byte to string for re operation
    if re.search('^From',line) is not None:
        sumFind+=1

print(f'There are {sumFind} lines that match.')

腳本的輸出是

有0條匹配的行。

這是輸入文本的鏈接: 文本

非常感謝您的寶貴時間。

錯誤是使用str將字節轉換為字符串。

>>> str(b'foo')
"b'foo'"

您將需要

line = line.decode()

但是最好的方法是將字節正則表達式傳遞給正則表達式,這是受支持的:

for line in fhand:
    if re.search(b'^From',line) is not None:
        sumFind+=1

現在我有54場比賽。

請注意,您可以將整個循環簡化為:

sum_find = sum(bool(re.match(b'From',line)) for line in fhand)
  • re.match取代了在搜索中使用^的需要
  • 無需循環, sum計數re.match返回真實值的時間(明確轉換為bool因此可以求和0或1)

甚至沒有正則表達式也更簡單:

sum_find = sum(line.startswith(b"From") for line in fhand)

您的問題是urllib模塊從url / text文件返回字節而不是字符串。

您可以:

  1. 在正則表達式搜索中使用字節:re.search(b'From',行)。
  2. 使用請求模塊將文件下載為字符串並按行分割:

    匯入要求

    txt = requests.get(' http://www.py4inf.com/code/mbox-short.txt ').text.split('\\ n')

    對於txt中的行:...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM