Skip to content

Star Wars Solution


Solution 1

import re

pattern = re.compile("[^\d]*")
newquotes = [pattern.search(string=x).group() for x in quotes]

print(newquotes)
# [
#     'A ', 
#     'I might as well sleep for ', 
#     'Hey Patrick, I thought of something funnier than ', 
#     'I will have you know that I stubbed my toe last week and only cried for ', 
#     'Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until '
# ]

Explanation

Consider the string I might as well sleep for 100 years or so..

  1. re.search(pattern="[^\d]", string=...) matches the first non digit character (from the beginning of the string).

    I might as well sleep for 100 years or so.
    
  2. re.search(pattern="[^\d]*", string=...) matches zero or more non digit characters (from the beginning of the string).

    I might as well sleep for 100 years or so.
    
  3. re.search() returns a match object (assuming a match is found).

    re.search(pattern="[^\d]*", string=quote)
    # <re.Match object; span=(0, 26), match='I might as well sleep for '>
    

    Match objects have a .group() method which can be used to return the matching substring (or the ith matching capture group).

    match = re.search(pattern="[^\d]*", string=quote)
    match.group()
    # 'I might as well sleep for '
    
  4. This technique can be extended with list comprehension to fetch the matching substring from each string in quotes.

    [re.search(pattern="[^\d]*", string=x).group() for x in quotes]
    
    # [
    #     'A ', 
    #     'I might as well sleep for ', 
    #     'Hey Patrick, I thought of something funnier than ', 
    #     'I will have you know that I stubbed my toe last week and only cried for ', 
    #     'Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until '
    # ]
    
  5. Since we reuse the same regex multiple times, it'll be more efficient if we compile it!

    pattern = re.compile("[^\d]*")
    newquotes = [pattern.search(string=x).group() for x in quotes]
    
    print(newquotes)
    # [
    #     'A ', 
    #     'I might as well sleep for ', 
    #     'Hey Patrick, I thought of something funnier than ', 
    #     'I will have you know that I stubbed my toe last week and only cried for ', 
    #     'Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until '
    # ]
    

Solution 2

import re

pattern = re.compile("\d.*")
newquotes = [pattern.sub(string=x, repl="") for x in quotes]

print(newquotes)
# [
#     'A ', 
#     'I might as well sleep for ', 
#     'Hey Patrick, I thought of something funnier than ', 
#     'I will have you know that I stubbed my toe last week and only cried for ', 
#     'Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until '
# ]

Explanation

The strategy here is to identify the first digit in each string and everything after it, and replace that matching substring with the empty string "".

  1. \d matches a digit.

    A 5 letter word for happiness... MONEY.
    I might as well sleep for 100 years or so.
    Hey Patrick, I thought of something funnier than 24... 25!
    I will have you know that I stubbed my toe last week and only cried for 20 minutes.
    Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until 4
    
  2. \d. matches a digit followed by any character.

    A 5 letter word for happiness... MONEY.
    I might as well sleep for 100 years or so.
    Hey Patrick, I thought of something funnier than 24... 25!
    I will have you know that I stubbed my toe last week and only cried for 20 minutes.
    Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until 4
    

    Important

    Notice that the last quote no longer has a match!

  3. \d.* matches a digit followed by zero or more repetitions of any character.

    A 5 letter word for happiness... MONEY.
    I might as well sleep for 100 years or so.
    Hey Patrick, I thought of something funnier than 24... 25!
    I will have you know that I stubbed my toe last week and only cried for 20 minutes.
    Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until 4
    
  4. Replace the matches in step 3 with empty strings.

    import re
    
    pattern = re.compile("\d.*") # (1)!
    newquotes = [pattern.sub(string=x, repl="") for x in quotes] # (2)!
    
    print(newquotes)
    # [
    #     'A ', 
    #     'I might as well sleep for ', 
    #     'Hey Patrick, I thought of something funnier than ', 
    #     'I will have you know that I stubbed my toe last week and only cried for ', 
    #     'Sandy: Don’t you have to be stupid somewhere else? Patrick: Not until '
    # ]
    
    1. Compile the pattern in preparation for repeated use.
    2. Use list comprehension combined with Pattern.sub() to replace matching groups with the empty string.

See the problem