5

I am kindof stuck in extracting an IPv4 address from a String.


My input string & constraints are as follows :

  • IPv4 Range : 0.0.0.0 to 255.255.255.255
  • IPv4 address may / may not be present in the string
    • Valid Examples : this is an ip & this is an ip 200.100.2.32
  • String may start with IPv4 address
    • Valid Examples : 200.100.2.32 is an ip | Output : ['200.100.2.32']
    • Invalid Examples : 200.100.2.32is an ip | Output : []
  • String may end with IPv4 address
    • Valid Examples : the ip is 200.100.2.32 | Output : ['200.100.2.32']
    • Invalid Examples : the ip is200.100.2.32 | Output : []
  • String may contain an IPv4 address in the middle, and if it does - there will a space before and after the IPv4 address.
    • Valid Examples : the ip is 200.100.2.32 and it is ipv4 | Output : ['200.100.2.32']
    • Valid Examples : the ip is 200.100.2.32and it is ipv4 | Output : []
  • Multiple IPs may be present in a single string
    • Valid Examples : 200.100.2.32 100.50.1.16 | Output : ['200.100.2.32', '100.50.1.16']
    • Invalid Examples : 200.100.2.32.100.50.1.16 | Output : []

I am trying to build a regex for the above cases, they look fairly straightforward, and I am not able to incorporate all the regex checks.

I have been referring to the answers on these links : Link1, Link2, Link3


Can someone help me in the right direction? To Summarize :

  • IPv4 will have a space before it or starts at the begining of the string
  • IPv4 will have a space after it or finishes at the end of the string
  • IPv4 obeys the range : 0.0.0.0 to 255.255.255.255

Code

def find_ip(str) :
    ip_pattern = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s') # need to strengthen the regex here
    ip = re.findall(ip_pattern, str)
    return ip
7
  • What code have you written? Commented Oct 17, 2015 at 23:15
  • adding the code to this in a min. making the edit. Commented Oct 17, 2015 at 23:15
  • Would the ipaddress module help you here? split the string and try calling IPv4Adress on each string from the split. Commented Oct 17, 2015 at 23:34
  • You've got the IP address done. Now it's just regex stuff. You need 0 or more of them, it can occur at the beginning of the string or after a blank, etc. Personally, I would make a separate regex for each of these cases and alternate them, but I'm no regex wizard! Commented Oct 17, 2015 at 23:38
  • @saulspatz - You don't need multiple regexes... Commented Oct 17, 2015 at 23:46

1 Answer 1

2

The regex:

(?:^|\b(?<!\.))(?:1?\d\d?|2[0-4]\d|25[0-5])(?:\.(?:1?\d\d?|2[0-4]\d|25[0-5])){3}(?=$|[^\w.])

An example of matches.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.