3

さまざまな稼働時間の文字列を解析し、時間の標準形式を生成するPythonライブラリを作成しています。私は次の場合に立ち往生しました:

私の正規表現はMon - Fri 7am - 5pm Sat 9am - 3pmasのグループを返す必要['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']がありますが、最初と2番目の間にコンマがある場合は、を返す必要があり[]ます。

また、カンマはどこにあってもかまいませんが、2つの平日と期間の間に置くことはできません。例:Mon - Fri 7am - 5pm Sat 9am - 3pm and available upon email, phone callを返す必要があり['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']ます。

これは私が試したことです、

import re
pattern = """(
    (?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs) # Start weekday
\s*[-|to]+\s* # Seperator
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)?  # End weekday
\s*[from]*\s* # Seperator
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Start hour
\s*[-|to]+\s* # Seperator
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Close hour
)"""

regEx = re.compile(pattern, re.IGNORECASE|re.VERBOSE)

print re.findall(regEx, "Mon - Fri 7am - 5pm Sat 9am - 3pm")
# output ['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm Sat - Sun 9am - 3pm")
# output ['Mon - Fri 7am - 5pm ', 'Sat - Sun 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm, Sat 9am - 3pm")
# expected output []
# but I get ['Mon - Fri 7am - 5pm,', 'Sat 9am - 3pm']
print re.findall(regEx, "Mon - Fri 7am - 5pm , Sat 9am - 3pm")
# expected output []
# but I get ['Mon - Fri 7am - 5pm ', 'Sat 9am - 3pm']

また、正規表現でネガティブルックアヘッドパターンを試しました

pattern = """(
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs)
\s*[-|to]+\s*
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)?
\s*[from]*\s*
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?)
\s*[-|to]+\s*
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?)
(?![^,])
)"""

しかし、私は期待されていませんでした。条件をチェックするためのコードを明示的に書く必要がありますか?明示的な条件チェックを作成する代わりに、正規表現を変更する方法はありますか?

私が実装したいもう1つの方法は、コンマが存在しない場合は2つの平日の期間の間にコンマを挿入し、正規表現をgroup by / splitbycommに変更することです。"Mon - Fri 7am - 5pm Sat 9am - 3pm"=>"Mon - Fri 7am - 5pm, Sat 9am - 3pm"

4

3 に答える 3

1

式全体を一致させるだけで、コンマ(および他の文字は許可されない)でそれを行うことができると思います:

pattern = """^(
(
    (?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs) # Start weekday
\s*[-|to]+\s* # Seperator
(?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)?  # End weekday
\s*[from]*\s* # Seperator
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Start hour
\s*[-|to]+\s* # Seperator
(?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][.]?m.?) # Close hour
)
)+$""

これは出力します:

[('Sat 9am - 3pm', 'Sat 9am - 3pm')]
[('Sat - Sun 9am - 3pm', 'Sat - Sun 9am - 3pm')]
[]
[]

それが役に立てば幸い、

于 2013-02-07T10:01:04.037 に答える
0

平日の2日間の間にカンマが存在しない場合は、毎回カンマをチェックして挿入するコードを数行記述しました。そのため、同じ形式を取得して、"Mon - Fri 7am - 5pm, Sat 9am - 3pm"さらに先に進むことができました。

于 2013-02-07T10:21:49.473 に答える
0

単一の正規表現でそれを行う方法を理解できませんでした。難しい質問がありました。私はあなたが必要なことをすることができましたが、私はそれを誇りに思っていないことに注意してください。

あなたがそれをする機能を持っているとしたら...

def sample_funct(unparsed_schedule)
    result = []

    # Day Pattern
    pattern = """
    (?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|m|w|f|thurs) # Start weekday
    \s*[-|to]+\s* # Seperator
    (?:mon|tue|wed|thu|fri|sat|sun|mo|tu|we|th|fr|sa|su|^(?![ap])m|w|f|thurs)?  # End weekday
    \s*[from]*\s* # Seperator
    (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][\.]?m\.?) # Start hour
    \s*[-|to]+\s* # Seperator
    (?:\d{1,2}(?:[:]\d{1,2})?)\s*(?:[ap][\.]?m\.?) # Close hour
    """

    # No commas pattern
    pattern2 = "%s\s*[^,]\s*%s" % (pattern, pattern)

    # Actual Regex Pattern Items
    schedule     = re.compile(pattern, re.IGNORECASE|re.VERBOSE)
    remove_comma = re.compile(pattern2, re.IGNORECASE|re.VERBOSE)

    # Check we have no commas in the middle
    valid_result = re.search(remove_comma, unparsed_schedule)
    if valid_result:
        # Positive result, return the list with schedules
        result = re.findall(schedule, validresult.group(0))

    # If no valid results will return empty list
    return result 
于 2013-02-13T07:05:52.193 に答える