簡體   English   中英

正則表達式查找不包含某些字符的數字

[英]Regex to find digits not followed by certain characters

我目前有一個文本字段,其中包含有關將用於計划目的的時間的信息。 由於它是文本字段,因此數據是非結構化的,並且具有許多不同的格式。 數據示例包括:

  • 周一至周六6-7:30pm
  • 星期二/星期四5:00-6:30
  • M / T / W 3:30 -7
  • F 4-5

因此,我試圖編寫一個解析器以將其轉換為可用的數據點。 我目前正在研究時間部分。 為了構造數據並能夠將其傳遞到dateutil解析器中,我想一直“填寫”。 6將變為6:00,7將變為7:00,以此類推。為此,我嘗試使用正則表達式:

reg = re.compile('[\d]([^:]|$)')

這個想法是要得到在它之后或在行末沒有數字的任何數字。 但是,我意識到這將獲得太多的數據點,因為在第一個示例中它將獲得7:30的“ 3”和7:30的0。

將數據轉換為可用格式的更好方法是什么?

我將分兩階段進行,利用re.split一個有趣的功能, re.split示例數據:

line1 = 'Mon-Wed 6-7:30pm'
line2 = 'Tuesday/Thurs 5:00 - 6:30'
line3 = 'M/T/W 3:30 -7'
line4 = 'F 4-5'

功能:

def add_zeros(line):
    parts = re.split(r'(\d{1,2}:\d{1,2})',line)
    parts[::2] = [re.sub(r'(\d{1,2})',r'\1:00',p) for p in parts[::2]]
    return ''.join(parts)

用法:

print(add_zeros(line1)) # Mon-Wed 6:00-7:30pm
print(add_zeros(line2)) # Tuesday/Thurs 5:00 - 6:30
print(add_zeros(line3)) # M/T/W 3:30 -7:00
print(add_zeros(line4)) # F 4:00-5:00

說明:

我給re.sub的第一個參數。 re.split給出了一個list其中奇數索引的元素為分隔符 使用我在re.split使用的模式, 分隔符為“就緒”小時(不需要零填充)。 然后,我在列表的每個偶數索引元素(非“就緒”小時)上使用re.sub ,將每個1或2位數字視為一個小時,然后將其替換為數字,然后加上:00

您可以使用負向后看和負向前看(?<!(:)\\d)\\d(?!(:|\\d)) https://regex101.com/r/nAQh3e/4這將選擇數字之前或之后沒有數字並且還沒有的數字:

我認為用占位符替換正確的時間后,找到錯誤的時間會容易得多。 然后,我們可以糾正錯誤的時間格式,然后再次將占位符替換為實際時間

這是簡單的實現,您可以根據需要進行調整

import re

texts = ["Mon-Wed 6-7:30pm",
"Tuesday/Thurs 5:00 - 6:30",
"M/T/W 3:30 -7",
"F 4-5",]

def get_placeholder_replacer(replaced_strings):
    def replace_with_placeholder(x):
        replaced_strings.append(x[0])
        return "{}"
    return replace_with_placeholder


ptrn_correct_time = re.compile(r"\d+:\d+")
ptrn_incorrect_time = re.compile(r"\d{1,2}")

for text in texts:
    replaced_strings = []
    placeholder_replacer = get_placeholder_replacer(replaced_strings)
    new_text = ptrn_correct_time.sub(placeholder_replacer,text)
    new_text = ptrn_incorrect_time.sub(lambda x: "{}:00".format(x[0]), new_text)

    print(new_text.format(*replaced_strings))

## Output
# Mon-Wed 6:00-7:30pm
# Tuesday/Thurs 5:00 - 6:30
# M/T/W 3:30 -7:00
# F 4:00-5:00

暫無
暫無

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

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