31

私は次の入力を持っています、

OK SYS 10 LEN 20 12 43
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
.

そして、「」を含む行と単一の(ドット)を含む最後の行を除くすべての入力を抽出したいと思います。つまり、以下を抽出したいOK SYS 10 LEN 20"."

1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt.1234 /data/c13af4/f.txt

私は次のことを試みました、

for item in output:
    matchObj = re.search("^(?!OK) | ^(?!\\.)", item)
    if matchObj:
        print "got item "  + item

ただし、出力が生成されないため、機能しません。

4

8 に答える 8

55

実際に見てみましょう:

matchObj = re.search("^(?!OK|\\.).*", item)

.*否定的な先読みの後に置くことを忘れないでください。そうしないと、一致が得られません;-)

于 2012-08-23T12:25:43.607 に答える
6
 if not (line.startswith("OK ") or line.strip() == "."):
     print line
于 2012-08-23T12:08:28.433 に答える
6

否定一致を使用します。(また、空白はデフォルトで正規表現内で重要であるため、スペースを空けないでください。または、re.VERBOSEを使用してください。)

for item in output:
    matchObj = re.search("^(OK|\\.)", item)
    if not matchObj:
        print "got item " + item
于 2012-08-23T12:15:10.343 に答える
4

OK SYS 行を一致させて返さないのはなぜですか。

for item in output:
    matchObj = re.search("(OK SYS|\\.).*", item)
    if not matchObj:
        print "got item "  + item
于 2012-08-23T12:08:31.260 に答える
1

これがファイルの場合、最初と最後の行をスキップして残りを読むことができますcsv:

>>> s = """OK SYS 10 LEN 20 12 43
... 1233a.fdads.txt,23 /data/a11134/a.txt
... 3232b.ddsss.txt,32 /data/d13f11/b.txt
... 3452d.dsasa.txt,1234 /data/c13af4/f.txt
... ."""
>>> stream = StringIO.StringIO(s)
>>> rows = [row for row in csv.reader(stream,delimiter=',') if len(row) == 2]
>>> rows
[['1233a.fdads.txt', '23 /data/a11134/a.txt'], ['3232b.ddsss.txt', '32 /data/d13f11/b.txt'], ['3452d.dsasa.txt', '1234 /data/c13af4/f.txt']]

ファイルの場合、これを行うことができます:

with open('myfile.txt','r') as f:
   rows = [row for row in csv.reader(f,delimiter=',') if len(row) == 2]
于 2012-08-23T12:09:33.187 に答える
0
and(re.search("bla_bla_pattern", str_item, re.IGNORECASE) == None)

は働いている。

于 2015-05-01T15:38:10.700 に答える
0

否定的な先読みなしでそれを行うこともできます。抽出したい式の部分に括弧を追加するだけです。この括弧付きの構造は と名付けられてgroupいます。

Pythonコードを書きましょう:

string = """OK SYS 10 LEN 20 12 43
1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt
.
"""

search_result = re.search(r"^OK.*\n((.|\s)*).", string)

if search_result:
    print(search_result.group(1))

出力は次のとおりです。

1233a.fdads.txt,23 /data/a11134/a.txt
3232b.ddsss.txt,32 /data/d13f11/b.txt
3452d.dsasa.txt,1234 /data/c13af4/f.txt

^OK.*\nOK ステートメントを含む最初の行が見つかりますが、抽出したくないので、括弧なしで残します。次はキャプチャしたい部分:((.|\s)*)なので、括弧で囲みます。regexp の最後で dot を探しますが.、それもキャプチャしたくありません。

PS: この回答は、グループの力を理解するのに非常に役立ちます。https://stackoverflow.com/a/3513858/4333811

于 2018-11-28T09:58:54.883 に答える