2
tickettypepat = (r'MIS Notes:.*(//p//)?.*')
retype = re.search(tickettypepat,line)
if retype:
  print retype.group(0)
  print retype.group(1)

入力が与えられます。

MIS Notes: //p//

group(0) がなぜなのか誰か教えてもらえますか

MIS Notes: //p// 

group(1) は None として返されますか?

問題が発生する前に、マッチングは単なるマッチングよりも複雑だったので、私はもともと正規表現を使用していました //p// ここに完全なコードがあります。私はこれにかなり慣れていないので、私の初心者を許してください。これの多くを達成するためのより良い方法があると確信しています。しかし、//[pewPEW]// の正規表現が貪欲すぎるという問題を除けば、機能しているようです。助けてくれてありがとう。


テキストを取り、いくつかのものをクリーンアップ/変換します。

filename = (r'.\4-12_4-26.txt')
import re
import sys
#Clean up output from the web to ensure that you have one catagory per line
f = open(filename)
w = open('cleantext.txt','w')

origdatepat = (r'(Ticket Date: )([0-9]+/[0-9]+/[0-9]+),( [0-9]+:[0-9]+ [PA]M)')
tickettypepat = (r'MIS Notes:.*(//[pewPEW]//)?.*')

print 'Begining Blank Line Removal'
for line in f:
    redate = re.search(origdatepat,line)
    retype = re.search(tickettypepat,line)
    if line == ' \n':
        line = ''
        print 'Removing blank Line'
#remove ',' from time and date line    
    elif redate:
        line = redate.group(1) + redate.group(2)+ redate.group(3)+'\n'
        print 'Redating... ' + line

    elif retype:
        print retype.group(0)
        print retype.group(1)
        
        if retype.group(1) == '//p//':
            line = line + 'Type: Phone\n'
            print 'Setting type for... ' + line
        elif retype.group(1) == '//e//':
            line = line + 'Type: Email\n'
            print 'Setting type for... ' + line
        elif retype.group(1) == '//w//':
            line = line + 'Type: Walk-in\n'
            print 'Setting type for... ' + line
        elif retype.group(1) == ('' or None):
            line = line + 'Type: Ticket\n'
            print 'Setting type for... ' + line

    w.write(line)

print 'Closing Files'                 
f.close()
w.close()

そして、ここにいくつかのサンプル入力があります。

Ticket No.: 20100426132 
Ticket Date: 04/26/10, 10:22 AM 
Close Date:  
Primary User: XXX
Branch: XXX
Help Tech: XXX
Status: Pending  
Priority: Medium  
Application: xxx
Description: some issue
Resolution: some resolution
MIS Notes: some random stuff //p// followed by more stuff
Key Words:  

Ticket No.: 20100426132 
Ticket Date: 04/26/10, 10:22 AM 
Close Date:  
Primary User: XXX
Branch: XXX
Help Tech: XXX
Status: Pending  
Priority: Medium  
Application: xxx
Description: some issue
Resolution: some resolution
MIS Notes: //p//
Key Words:  

Ticket No.: 20100426132 
Ticket Date: 04/26/10, 10:22 AM 
Close Date:  
Primary User: XXX
Branch: XXX
Help Tech: XXX
Status: Pending  
Priority: Medium  
Application: xxx
Description: some issue
Resolution: some resolution
MIS Notes: //e// stuff....
Key Words:  


Ticket No.: 20100426132 
Ticket Date: 04/26/10, 10:22 AM 
Close Date:  
Primary User: XXX
Branch: XXX
Help Tech: XXX
Status: Pending  
Priority: Medium  
Application: xxx
Description: some issue
Resolution: some resolution
MIS Notes:
Key Words:  
4

3 に答える 3

4

MIS Notes:.*(//p//)?.*"MIS Notes: //p//"ターゲットとしての例では、次のように機能します。

  1. MIS Notes:一致"MIS Notes:"します。ここで驚きはありません。
  2. .*すぐに文字列の最後まで実行します (これまでの一致"MIS Notes: //p//")
  3. (//p//)?オプションです。何も起こりません。
  4. .*一致するものは何も残っていません。すでに文字列の最後にいます。スターは前のアトムのゼロ一致を許可するため、正規表現エンジンは文字列全体を一致としてレポートしなくなり、サブグループは空としてレポートします。

正規表現を に変更するMIS Notes:.*(//p//).*と、動作が変わります。

  1. MIS Notes:一致"MIS Notes:"しますが、ここでも驚きはありません。
  2. .*すぐに文字列の最後まで実行します (これまでの一致"MIS Notes: //p//")
  3. (//p//)必要です。エンジンは、この要件を満たすために、1 文字ずつバックトラックを開始します。(ここまで一致"MIS Notes: ")
  4. (//p//)一致することができます。サブグループ 1 が保存され、 が含まれます"//p//"
  5. .*文字列の最後まで実行されます。ヒント: 一致するものに関心がない場合は、不要なので削除できます。

正規表現を に変更するMIS Notes:.*?//(p)//と、動作が再び変わります。

  1. MIS Notes:一致"MIS Notes:"しますが、ここでも驚きはありません。
  2. .*?貪欲ではなく、続行する前に次のアトムをチェックします (これまでの一致"MIS Notes: ")
  3. //(p)//一致することができます。サブグループ 1 が保存され、 が含まれます"p"
  4. 終わり。バックトラッキングが発生しないことに注意してください。これにより時間が節約されます。

/の前に何もないことがわかっている場合は//p//、次を使用できます: MIS Notes:[^/]*//(p)//:

  1. MIS Notes:一致"MIS Notes:"すると、アイデアが得られます。
  2. [^/]*最初のスラッシュまで早送りできます (これは よりも高速です.*?)
  3. //(p)//一致することができます。サブグループ 1 が保存され、 が含まれます"p"
  4. 終わり。バックトラッキングが発生しないことに注意してください。これにより時間が節約されます。これはバージョン #3 よりも高速です。
于 2010-05-03T18:51:54.137 に答える
1

正規表現は貪欲です。つまり、.*可能な限り文字列全体に一致します。したがって、オプションのグループに一致するものは何も残っていません。group(0)常に一致した文字列全体です。

あなたのコメントから、なぜ正規表現が必要なのですか? このようなものでは十分ではありません:

if line.startswith('MIS Notes:'): # starts with that string
    data = line[len('MIS Notes:'):] # the rest in the interesting part
    if '//p//' in data:
        stuff, sep, rest = data.partition('//p//') # or sothing like that
    else:
        pass #other stuff
于 2010-05-03T18:07:59.667 に答える
0

パターンはあなたの目的にはあいまいです。接頭辞または接尾辞でグループ化するとよいでしょう。ここの例では、プレフィックスのグループ化を選択しました。基本的に//p//、行に発生する場合、プレフィックスは空ではありません。サフィックスは、//p//アイテムの後のすべて、または存在しない場合は行内のすべてになります。

import re
lines = ['MIS Notes: //p//',
    'MIS Notes: prefix//p//suffix']

tickettypepat = (r'MIS Notes: (?:(.*)//p//)?(.*)')
for line in lines:
    m = re.search(tickettypepat,line)
    print 'line:', line
    if m: print 'groups:', m.groups()
    else: print 'groups:', m

結果:

line: MIS Notes: //p//
groups: ('', '')
line: MIS Notes: prefix//p//suffix
groups: ('prefix', 'suffix')
于 2010-05-03T18:30:39.610 に答える