-1
votes

Regex pour obtenir mot avant et après le mot donné

Quelqu'un peut-il vous aider avec le modèle de regex pour la chaîne ci-dessous en Python? J'ai .log code> et je souhaite trouver ci-dessous la ligne à partir de la chaîne que je dois obtenir l'utilisateur et la propriété intellectuelle.

Je veux que regex puisse me donner un mot avant code> de code> et un après de code>. p> xxx pré>

je veux root code> et 123.183.209.132 code> de la chaîne ci-dessus p>

def parse(filename, date=None):
    try:
        # string = 'Failed password for ([a-z]*|[a-z]* [a-z]* [a-z]*) from '
        string = 'Failed password for ([a-z]*|[a-z]* [a-z]* [a-z]*) from [0-9]+(?:\.[0-9]+){3}'
        # string_sub = 'for (?<user>[a-zA-Z\.]+).*?(?<ip>(?:\d{1,3}\.){3}\d{1,3})'
        # string_re = re.compile(r"^[^ ]+ - (C[^ ]*) \[([^ ]+)").match
        match_list =[]
        with open(filename, 'r') as file:
            for line in file:
                for match in re.finditer(string, line, re.S):
                    match_text = match.group()
                    user_ip = re.search(r'Failed password for .*?(\w+) from (\d+(?:\.\d+){3})', match_text)
                    user = user_ip.groups()[0]
        print(user)
    except KeyError as e:
        msg="key %s is missing" % str(e)
        return msg
    except Exception as e:
        return str(e)


3 commentaires

Est-ce que cela répond à votre question? apprendre des expressions régulières


J'ai modifié ma question je suis bloqué avec l'obtention d'un utilisateur et de votre adresse IP.


J'ai fini avec regex pour la 1ère partie, je n'ai besoin que de regex pour une partie de la 2e chaîne. Quelqu'un peut-il aider avec un seul?


3 Réponses :


-1
votes

Si je comprends correctement, vous voulez essentiellement le mot (nom d'utilisateur) après pour code> et le ip code> de cette ligne? Si c'est le cas, que diriez-vous: xxx pré>

https: // regex101 .COM / R / AOJBYS / 1 . Accordé, il s'agit d'une forme courte pour une adresse IP, mais de le rendre plus correct, vous devez utiliser un REGEX IPv4 . P>

En outre, dans votre question, vous ne dites pas ce qui devrait être capturé à partir de ce qui suit, ce qui pourrait modifier la regex ci-dessus. P>

Failed password for invalid user packer from 13.82.211.217 port 45832 ssh2.


3 commentaires

Ce serait facile si je reçois un mot avant et après le mot de .


@aakankshakhandelwal mais votre dernier exemple ne contient pas le mot du tout?


Il y a deux chaînes différentes, donc j'aurai besoin de deux regex différentes. 1. Pour REGEX.SUB () Pour obtenir l'utilisateur et la propriété intellectuelle à partir de la chaîne. 2. Obtenir un objet et une adresse IP de 2e chaîne.



0
votes

regex peut être surchargé pour votre cas d'utilisation ... Avez-vous essayé des choses plus simples, comme ceci, par exemple: xxx


0 commentaires

-1
votes
(?:                     # non capture group
    Failed password     # literally
  |                   # OR
    reverse mapping     # literally
    .+?                 # 1 or more any character, not greedy
)                       # end group
 for                    # literally
 .*?                    # 0 or more any character
 ([\w.]+)               # group 1, 1 or more word character or dot
 \s+                    # 1 or more spaces
 (?:from |\[)           # non capture group, from OR opening square bracket
(\d+(?:\.\d+){3})       # group 2, IP

1 commentaires

Travaillé parfaitement pour la chaîne supérieure. J'ai besoin de la même chose pour une chaîne donnée ci-dessous aussi Vérification de la cartographie inverse gettaddrinfo pour non défini.datagroup.ua [93.183.207.5] a échoué - tentative de rupture possible! .