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
Community
  • 1
  • 1
sudhishkr
  • 3,318
  • 5
  • 33
  • 55
  • What code have you written? – Thomas Junk Oct 17 '15 at 23:15
  • adding the code to this in a min. making the edit. – sudhishkr Oct 17 '15 at 23:15
  • Would the [`ipaddress`](https://docs.python.org/3/library/ipaddress.html) module help you here? `split` the string and `try` calling [`IPv4Adress`](https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Address) on each string from the split. – Navith Oct 17 '15 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! – saulspatz Oct 17 '15 at 23:38
  • @saulspatz - You don't need multiple regexes... – TigerhawkT3 Oct 17 '15 at 23:46
  • @TigerhawkT3 - i was trying to solve this multiple regexes. Is there anyway to to simplify/sysnthesise this to a single regex? – sudhishkr Oct 18 '15 at 01:12
  • I don't see anything to simplify. Just use the expression in the linked duplicate, and it'll find any IP address, wherever it appears in a string. – TigerhawkT3 Oct 18 '15 at 01:17

1 Answers1

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.

Dmitry Sokolov
  • 3,118
  • 1
  • 30
  • 35