Python: Detect word from string and also find its location

I am new to python and want to make a simple program that prints back your name and preposition in James Bond style.

So if the name contains any prepositions, such as ‘Van’, ‘Von’, ‘De’ or ‘Di’, I want the program to print it as:

{Preposition} {LastName}, {FirstName} {Preposition} {LastName} *edited

For this, I understand we need a list of the users name and of the prepositions.

a = [user input separated with the .split function]
b = [list of prepositions]

In order to find the instance of a preposition in the name, I found that the code bellow could be used:

if any(x in a for x in b):

However, I encountered a problem when trying to print the name, seeing as the preposition could be any from the aforementioned (list b). I can not find a way to print without knowing this and its location in the string. First I thought the .index function could be used, but it seems to only be capable of searching for one word, not several as needed here. The closest I can get is:

name_split.index('preposition1') # works
name_split.index('preposition1', 'preposition2', etc.) # does not work

So what I’m asking is if there is a way to check if any of the words from a list (b) is used in an inputted text, and also get the location of said word.

Hope I was able to explain it properly, and that someone could lend me some assistance. In advance; thank you.

Answer

I can’t think of a better way of doing this than using the for loop:

pattern = "{1} {2}, {0} {1} {2}"
prepositions = ['van', 'von', 'de', 'di']

# (optional) 'lower' so that we don't have to consider cases like 'vAn'
name = "Vincent van Gogh".lower()
index = -1  # by default, we believe that we did not find anything
for preposition in prepositions:
    # 'find' is the same as 'index', but returns -1 if the substring is not found
    index = name.find(preposition)
    if index != -1:
        break  # found an entry

if index == -1:
    print("Not found")
else:
    print("The index is", index,
          "and the preposition is", preposition)
    print(pattern.format(*name.split()))

Outputs:

The index is 8 and the preposition is van
van gogh, vincent van gogh

If you want to iterate through the list of names then you could do that:

pattern = ...
prepositions = ...
names = ...

for name in names:
    name = name.lower()
    ... # the rest is the same

New version with the second type of prepositions ("Jr.", "Sr."):

def check_prepositions(name, prepositions):
    index = -1

    for preposition in prepositions:
        index = name.find(preposition)
        if index != -1:
            break  # found an entry

    return index, preposition


patterns = [
    "{1} {2}, {0} {1} {2}",
    "{1}, {0} {1} {2}"
]

all_prepositions = [
    ['van', 'von', 'de', 'di'],
    ["Jr.", "Sr."]
]

names = ["Vincent van Gogh", "Robert Downey Jr.", "Steve"]

for name in names:
    for pattern, prepositions in zip(patterns, all_prepositions):
        index, preposition = check_prepositions(name, prepositions)

        if index != -1:
            print("The index is", index,
                  "and the preposition is", preposition)
            print(pattern.format(*name.split()))
            break

    if index == -1:
        print("Not found, name:", name)

Outputs:

The index is 8 and the preposition is van
van Gogh, Vincent van Gogh
The index is 14 and the preposition is Jr.
Downey, Robert Downey Jr.
Not found, name: Steve