1

When I run the below code the output is:

[HCO3-], [Ca+], [potassium ion concentration+], [Cl-]. HCO3-, Ca+, potassium ion concentration+, Cl-.

But it should be:

Bicarbonate ion concentration, Calcium ion concentration, potassium ion concentration, chloride ion concentration. Bicarbonate ions, Calcium ions, potassium ions, chloride ions.

Why is the function converting parts of the string but not the whole thing?

Code:

### imports
    import re

### definitions  
    def concentration_expansion(text):
        '''expand concentration names'''
        swaps = {
            '[Cl-]': 'chloride ion concentration', '[K+]': 'potassium ion concentration',
            '[Ca+]': 'Calcium ion concentration', '[HCO3-]': 'Bicarbonate ion concentration',
            }

        initial = text
        for key in swaps:
            pattern = r'\b' + '{}'.format(key) + r'\b'
            text = re.sub(pattern, swaps.get(key), text, flags=re.IGNORECASE)
        return text

    def ion_abbrev(text):
        '''expand ion names'''
        swaps = {
            'Cl-': 'chloride ions', 'K+': 'potassium ions',
            'Ca+': 'Calcium ions', 'HCO3-': 'Bicarbonate ions',
            }

        initial = text
        for key in swaps:
            pattern = r'\b' + '{}'.format(key) + r'\b'
            text = re.sub(pattern, swaps.get(key), text, flags=re.IGNORECASE)
        return text

### program   
    text = '''
    [HCO3-], [Ca+], [K+], [Cl-].  HCO3-, Ca+, K+, Cl-.
    '''

    text = concentration_expansion(text)

    print(text)
  • Your keywords start/end with special chars, and `\b` meaning is context-depedent. Use either unambiguous word boundaries or whitespace boundaries. – Wiktor Stribiżew Apr 08 '20 at 12:48

0 Answers0